Java中的正则表达式反向引用

时间:2016-06-09 19:00:19

标签: java regex

我必须匹配一个数字,然后自己匹配14次。然后我在regexstor.net/tester

中找到了以下正则表达式
(\d)\1{14}

修改

当我将其粘贴到我的代码中时,包括正确的反斜杠:

"(\\d)\\1{14}"

我已经用"\1"替换了后引用"$1""\N"用于替换Java中的匹配。

然后我意识到它不起作用。当您需要在REGEX中反向引用匹配项时,必须使用"$N",但是当您想要替换它时,运算符为public static IEnumerable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement>( this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector )

我的问题是:为什么?

2 个答案:

答案 0 :(得分:7)

}}", "secret_key": "{{user不是Java正则表达式中的后向引用,也不是我能想到的任何其他类型。当您替换时,您只能使用}}", "region": "us-east-1", "source_ami": "ami-452bd728", "instance_type": "r3.xlarge", "ssh_username": "ubuntu", "ami_name": "packer-test-hvm {{timestamp}}", "ami_virtualization_type": "hvm", "force_deregister": true, "ami_regions": ["us-east-1", "us-west-2"] }],

$1

关于背面参考是什么的一些错误信息,包括我从以下代码获得的地方:simple java regex with backreference does not work

Java在$1已经是元字符的其他现有风格之后对其正则表达式语法进行了建模。它锚定到字符串的末尾(或多行模式中的行)。

同样,Java使用String input="A12.3 bla bla my input"; input = StringUtils.replacePattern( input, "^([A-Z]\\d{2}\\.\\d).*$", "$1"); // ^^^^ 进行反向引用。由于正则表达式是字符串,因此必须对其进行转义:$

从词汇/句法的角度来看,\1可以毫不含糊地使用(作为奖励,它可以防止在使用反向引用时需要“邪恶的逃脱”)。

要匹配行结束后的\\1,正则表达式必须为$1

1

使用熟悉的语法而不是更改规则更有意义,其中大多数来自Perl。

Perl的第一个版本出现在1987中,它比Java早得多,后者于[1995]发布

我挖出了man pages for Perl 1,其中说:

  

也可以使用包围构造$\n1,在这种情况下,this line 1 匹配(\ ...\ )个子字符串。 (在模式之外,始终在数字前面使用\<digit>而不是digit$(和\$<digit>和{{的范围1}})延伸到封闭的BLOCK或eval字符串的末尾,或延伸到与子表达式的下一个模式匹配。$\`符号有时在当前模式之外工作,但不应该依赖。)你可能有尽可能多的括号。如果您有超过9个子字符串,则变量$&$',...引用相应的子字符串。在模式中,\<digit>$10等,如果在反向引用之前至少有很多左边的parens,则返回子字符串。否则(对于向后兼容性)$11\10相同,退格,\11\10相同,即标签。等等。 (\010\11始终是反向引用。)

答案 1 :(得分:3)

我认为主要的问题不是反向引用 - 它在java中与if完全正常。

你的问题更可能是&#34;整体&#34;在Java中逃避正则表达式模式。

如果你想拥有模式

\1

传递给正则表达式引擎,你首先需要转义它,因为当你编写它时它是一个java字符串:

(\d)\1{14}

Voila,就像一个魅力:goo.gl/BNCx7B(添加http://,SO不允许Url-Shorteners,但是tutorialspoint.com似乎没有其他选项)

离线-示例:

(\\d)\\1{14}