小编pol*_*nts的帖子

gsub中的反斜杠(转义和反向引用)

考虑以下代码段:

puts 'hello'.gsub(/.+/, '\0 \\0 \\\0 \\\\0')
Run Code Online (Sandbox Code Playgroud)

打印结果(如ideone.com所示):

hello hello \0 \0
Run Code Online (Sandbox Code Playgroud)

这非常令人惊讶,因为我希望看到这样的东西:

hello \0 \hello \\0
Run Code Online (Sandbox Code Playgroud)

我的观点是,这\是一个转义字符,因此您编写\\以获得一个文字反斜杠,因此\\0是一个文字反斜杠,\后跟0,等等。显然,这不是gsub解释它的方式,因此有人可以解释这是怎么回事吗?

我该怎么做才能得到上面想要的替代品?

ruby regex backreference replace escaping

4
推荐指数
1
解决办法
1770
查看次数

使用相同的组捕获<thisPartOnly>和(thisPartOnly)

假设我们有以下输入:

<amy>
(bob)
<carol)
(dean>
Run Code Online (Sandbox Code Playgroud)

我们还有以下正则表达式:

<(\w+)>|\((\w+)\)
Run Code Online (Sandbox Code Playgroud)

现在我们得到两场比赛(如rubular.com上所示):

  • <amy>是匹配,\1捕获amy,\2失败
  • (bob)是匹配,\2捕获bob,\1失败

这个正则表达式完成了我们想要的大部分内容,它们是:

  • 它恰当地匹配打开和关闭括号(即没有混合)
  • 它捕获了我们感兴趣的部分

但是,它确实有一些缺点:

  • 重复捕获模式(即"主要"部分)
    • 这只是\w+在这种情况下,但一般来说这可能非常复杂,
      • 如果涉及反向引用,则必须为每个备用重新编号!
      • 重复使维护成为一场噩梦!(如果它改变了怎么办?)
  • 这些组基本上是重复的
    • 根据哪些备用匹配,我们必须查询不同的组
      • 它只是\1\2在这种情况下,但通常"主要"部分可以拥有自己的捕获组!
    • 这不仅不方便,而且可能存在不可行的情况(例如,当我们使用仅限于查询一个组的自定义正则表达式框架时)
  • 如果我们也想要匹配等{...},情况会迅速恶化[...].

所以问题很明显:如何在不重复"主要"模式的情况下做到这一点?

注意:在很大程度上我对java.util.regex口味感兴趣,但欢迎其他口味.


附录

这部分没有什么新内容; 它只用一个例子说明了上面提到的问题.

让我们将上面的例子带到下一步:我们现在想要匹配这些:

<amy=amy>
(bob=bob)
[carol=carol]
Run Code Online (Sandbox Code Playgroud)

但不是这些:

<amy=amy)   # non-matching bracket
<amy=bob>   # left hand side not equal to right hand side
Run Code Online (Sandbox Code Playgroud)

使用替代技术,我们有以下工作(如rubular.com上所示): …

java regex capturing-group

4
推荐指数
1
解决办法
355
查看次数

4
推荐指数
2
解决办法
937
查看次数

摊还是否真的令人满意?

例如,假设我有一个算法是O(n),算法是一个摊销的O(n).可以公平地说,在严格意义上说,非摊销算法总是会比摊销算法快或快吗?或者是否有任何理由更喜欢分期付款的版本(忽略代码简单或易于实现)?

algorithm big-o amortized-analysis

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

为什么Java编译器会抱怨本地变量未在此处初始化?

int a = 1, b;
if(a > 0) b = 1;
if(a <= 0) b = 2;
System.out.println(b);
Run Code Online (Sandbox Code Playgroud)

如果我运行这个,我收到:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
 The local variable b may not have been initialized

 at Broom.main(Broom.java:9)

我知道局部变量没有初始化,你有责任这样做,但在这种情况下,第一个if不初始化变量?

java variables compiler-errors initialization variable-assignment

3
推荐指数
2
解决办法
2000
查看次数

正则表达式分裂成重叠的字符串

我正在探索正则表达式的强大功能,所以我只是想知道这样的事情是否可行:

public class StringSplit {
    public static void main(String args[]) {
        System.out.println(
            java.util.Arrays.deepToString(
                "12345".split(INSERT_REGEX_HERE)
            )
        ); // prints "[12, 23, 34, 45]"
    }
}
Run Code Online (Sandbox Code Playgroud)

如果可能的话,那么只需提供正则表达式(以及对其如何工作的先发制人的解释).

如果它只能用于Java以外的一些正则表达式,那么也可以随意提供它们.

如果不可能,请解释原因.


奖金问题

同样的问题,但有一个find()循环,而不是split:

    Matcher m = Pattern.compile(BONUS_REGEX).matcher("12345");
    while (m.find()) {
        System.out.println(m.group());
    } // prints "12", "23", "34", "45"
Run Code Online (Sandbox Code Playgroud)

请注意,并不是因为我有一个具体的任务来完成这种或那种方式,而是我想要了解正则表达式.我不需要做我想要的代码; 我想要正则表达式,如果它们存在,我可以在上面的代码中使用它来完成任务(或者使用其他版本的正则表达式,将代码"直接翻译"成另一种语言).

如果它们不存在,我想要一个很好的解释原因.

java regex split overlapping-matches

3
推荐指数
2
解决办法
1404
查看次数

创建大量数组

例如,你如何创建30个数组(它与char []的类型无关)?在我看来,手工制作它们并不是一个好主意.我想使用"for"循环来做到这一点,但我应该如何指定标识符?

java arrays

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

尝试将对象添加到PriorityQueue时出现NullPointerException

尝试将对象添加到优先级队列时,我不断收到空指针异常

我初始化队列:

private PriorityQueue<NodeObject> nodes;
Run Code Online (Sandbox Code Playgroud)

在这里我尝试添加到它:

NodeObject childNode = new NodeObject(child, 1);
nodes.add(childNode);
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?我知道我的NodeObject不是null,因为我在添加它之前创建它.

java add priority-queue nullpointerexception

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

使用"伪运算符"来区分简单重复与一般循环

我想知道其他人对以下编写for循环的方式的看法:

for (int rep = numberOfReps; rep --> 0 ;) {
   // do something that you simply want to repeat numberOfReps times
}
Run Code Online (Sandbox Code Playgroud)

我发明这种风格的原因是为了区别于更一般的for循环情况.当我需要简单重复的东西我只能用这个numberOfReps时间和循环体不使用的值rep,并numberofReps以任何方式.

据我所知,例如标准Java没有简单的说法"只重复N次",这就是我想出这个的原因.我甚至会说循环的主体不能continue或者break,除非在for循环的顶部明确记录,因为正如我所说的那样,整个目的是通过提出一个独特的方法使代码更容易理解用来表达简单重复的风格.

我们的想法是,如果你正在做的是不是简单的(上/一inreasing的价值下降指数,相关性breakS,continueS,等等),然后用标准的for循环.如果你在做什么简单的重复,而另一方面,则这个独特的风格传达了"事实"(一旦你知道的风格为目的,当然).

我说"事实",因为这种风格当然可以被滥用.我的运作假设你有能干的程序员,他们的目标是让他们的代码更容易理解,而不是更难.


发表了一条评论,其中提到了for仅应用于简单迭代的原则,并while应另外使用(例如,如果循环变量在体内被修改).

如果是这种情况,那么我只是扩展这个原则来说如果它比你的简单for循环更简单(即你甚至不关心迭代索引,或者它是增加还是减少等等,你只是想重复做N次),然后使用闪烁箭头for循环结构.


多么巧合,Josh Bloch刚文如下:

  Goes-to Considered Harmful:

  public static void main(String[] …
Run Code Online (Sandbox Code Playgroud)

java for-loop

2
推荐指数
1
解决办法
226
查看次数

2
推荐指数
1
解决办法
1355
查看次数