小编Yet*_*eek的帖子

使用像perl这样的递归正则表达式匹配Ruby中的平衡括号

我一直在寻找一种方法来匹配正则表达式中的平衡括号,并在Perl中找到了一种使用递归正则表达式的方法:

my $re;
$re = qr{
           \(
              (?:
                 (?> [^()]+ )       # Non-parens without backtracking
                 |
                 (??{ $re })        # Group with matching parens
              )*
           \)
         }x;
Run Code Online (Sandbox Code Playgroud)

来自perl正则表达式网站 .

有没有办法在Ruby或类似语言中执行此操作?

更新:

对于那里感兴趣的人有一些有趣的链接:

Oniguruma手册 - 来自Sawa的回答.

实用程序员的Ruby 1.9正则表达式示例章节

ruby regex perl

13
推荐指数
1
解决办法
9186
查看次数

在Java中,当该文件被其他线程锁定时,有没有办法读取文件?

所以我使用以下命令在文件上创建一个锁,以便我可以独占编辑它:

 File file = new File(filename);
 channel = new RandomAccessFile(file, "rw").getChannel();
 lock = channel.tryLock();
Run Code Online (Sandbox Code Playgroud)

现在我有第二个线程想要访问同一个文件 - 只是为了阅读,而不是编辑.我怎么做?现在第二个线程将抛出一个io异常并通知我该文件已被锁定.

这可行吗?有什么建议?谢谢

java file-io filelock

7
推荐指数
1
解决办法
2956
查看次数

与Perl 6序列相乘无论(...)运算符

我已经看到了序列中Perl 6无论(...)运算符的例子,我试图找出如何进行涉及乘法的序列.

操作员执行以下操作,如果以某些数字开头,则可以指定其后面的数字序列.

@natural = 1,2 ... *;
@powersOfTwo = 1,2,4 ... *;
Run Code Online (Sandbox Code Playgroud)

等等.也可以使用序列中的先前数字定义序列,如斐波那契数字(在此问题中显示),其中一个执行以下操作:

@fibonacci = 1,1, *+* ... *;
Run Code Online (Sandbox Code Playgroud)

问题是乘法运算符是*,以前的数字也表示*.

虽然我可以通过定义一个序列+,-并且/,我似乎无法找到使用定义序列的方法*.

我尝试过以下方法:

@powers = 1,2, *** ... *;
Run Code Online (Sandbox Code Playgroud)

但它显然不起作用.

有谁知道怎么做?

perl perl6 raku

7
推荐指数
1
解决办法
509
查看次数

有没有办法对集合类型进行概率恒定时间相等性检查?

问题

我想知道如何有效地比较两种集合类型(列表,集合,地图等).应该指出的是,结构上的平等不是基于参考的平等.

通常,必须遍历集合的所有元素并在它们之间进行比较,每次比较的成本为O(1),从而产生惊人的O(n)比较时间.

这可能会影响使用列表的哈希表,其中冲突检查相当昂贵或使用契约设计(例如,比较和旧的集合与新的).

当前解决方案的方向

我虽然有办法确定快速解决方案,但它们看起来都是开放式/非确定性的.如果能够使用可存储和比较的所有元素的某种独特散列,则可以使用这些想法.一个好的散列算法应该提供足够的enthropy,以便碰撞的可能性很小.

这种基于散列的比较技术可以通过使用一些列表头的恒定时间比较来加强(比如前10个元素).在开始时使用相同元素并使用良好散列算法的两个列表在理论上应该提供一些独特的比较.

问题

是否有可能创建一种常数时间比较(在某些时候像整数一样泛化和专用),是否可以通过唯一哈希技术实现?

更新

为了澄清这个问题,我不需要一个完美的平等检查,而是一个快速的"平等前"检查,作为一种加速真正的平等检查的方法.虽然许多哈希代码实现对集合比较很有用,但我也对列表(有序)比较感兴趣.

algorithm performance

7
推荐指数
1
解决办法
489
查看次数

在F#/ OCaML中实现类似quicksort的函数的尾递归版本

是否可以实现快速排序算法的尾递归版本(通过延续模式)?如果是的话,如何实现呢?

正常(未优化)版本:

let rec quicksort list =
 match list with
 | [] -> []
 | element::[] -> [element]
 | pivot::rest -> let ``elements smaller than pivot``, ``elements larger or equal to pivot``= 
                    rest |> List.partition(fun element -> element < pivot)
                  quicksort ``elements smaller than pivot`` @ [pivot] @ quicksort ``elements larger or equal to pivot``
Run Code Online (Sandbox Code Playgroud)

f# ocaml functional-programming tail-recursion

5
推荐指数
1
解决办法
2695
查看次数

Team Foundation Server比较

在本地与服务器文件上进行比较时,差异用红色和蓝色(文本/字体颜色)标记.每种颜色是什么意思?

.net version-control tfs

3
推荐指数
1
解决办法
795
查看次数

虽然循环不工作!

using namespace std;

void reverse(char a[],int slen, int elen)
 {
     int start,end,temp;
     for(start=slen,end=elen;start<end;start++,end--)
            {
                temp=a[start];
                a[start]=a[end];
                a[end]=temp;
            }
 }

 void reverseall(char b[])
  {
      char a[15];
      int i,j,n=0,len;
      for(i=14,j=0;i>=0,j<15;i--,j++)
           a[j]=b[i];

      i=0;
      j=0;

      while(a[i]!='\0')
         {cout<<"h";
            n++;
            i++;
         }

      while(j!=n)
         {
            if(j!=0)
              j++;
            len=0;
            while(a[j]!= ' ' && a[j]!='\0')
             {
                len++;
                j++;
             }
            reverse(a,j-len,j-1);
         }

     for(i=0;i<n;i++)
        cout<<a[i];
  }
int main()
 {
     char b[20]="hi how are you";
     reverseall(b);
     return 0;
 }
Run Code Online (Sandbox Code Playgroud)

我修改了一个适当反转工作程序 ,只添加了3行,而while循环现在不能正常工作.

 for(i=14,j=0;i>=0,j<15;i--,j++)
               a[j]=b[i];

          i=0;
          j=0;  
Run Code Online (Sandbox Code Playgroud)

这是程序的链接,我希望输出为"你是多么喜欢". …

c++ reverse while-loop

0
推荐指数
1
解决办法
394
查看次数