我必须匹配一个数字,然后自己匹配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
)
。
我的问题是:为什么?
答案 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}