java - 这两种语法\\d\\d\\d 和\\d{3} 在所有环境中都一样吗?

标签 java regex

想问一下这两个正则表达式有区别吗?

\d\d\d\d{3}

我已经在我的本地机器上使用 Java 和 Windows 操作系统对此进行了测试,两者都工作正常并且结果相同。但是,当在 linux 环境中运行时,\d\d\d 可以正常工作,而 \d{3} 则不能。环境是这里的一个因素吗?或者还有什么因素可以使这两个表达式的结果不同?

这是代码片段:

Pattern pattern = Pattern.compile( ".*aaa\\.bbb\\d{3}.ccc\\d{3}." );
Matcher matcher = pattern.matcher( "aaa.bbb033.ccc342.ffff" );
matcher.find();

使用 \d\d\d, matcher.find() = true

使用 \d{3},matcher.find() = false

最佳答案

不,有不同的正则表达式方言。[1] grep 甚至知道不止一种。

grep    'abc|def'     # Matches abc|def
grep    'abc\|def'    # Matches abc or def
grep -P 'abc|def'     # Matches abc or def
grep -P 'abc\|def'    # Matches abc|def

旧的 grep(没有 -P-E)根本无法识别 a{m}。或者 \d

$ cat foo
123
1{3}
\d{3}
\d\d\d

$ grep '\d{3}' foo
\d{3}

$ grep '\\d\\d\\d' foo
\d\d\d

$ grep '\d\d\d' foo
ddd

尽管它在“Perl”模式下(以及在某些版本中的“扩展”模式下)

$ grep - P '\d{3}' foo
123

$ grep -P '\d\d\d' foo
123

也就是说,我希望给定版本的 Java 的所有实现都能理解相同的正则表达式语言。


  1. 事实上,一些语言的正则表达式在技术上并不是original definition 的正则表达式。因为它们可以匹配超过 regular languages .

关于java - 这两种语法\\d\\d\\d 和\\d{3} 在所有环境中都一样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20625605/

相关文章:

ios - NSRegularExpression 帮助 + iOS

regex - 使用正则表达式批量重命名 *fastq.gz 文件

java - 分配大的新字符串时如何使用更少的内存

java - 当 p 和 q 是素数时,找到 n=p*q 的 'p' 和 'q'

java - 终于没有抛出栈溢出异常

regex - Vim 多行正则表达式给出重叠匹配

javascript - 在 JavaScript 位置查找下一个单词的位置

java - Hibernate DefaultEntityAliases 引发 NullPointerException

java - 如何检查字符串是否以多个前缀之一开头?

regex - 如何使用正则表达式识别不以斜杠字符 ('/' ) 结尾的字符串?