Java 这两种语法\\d\\d\\d和\\d{3}在所有环境中的工作方式是否相同?
请问这两个正则表达式之间有区别吗Java 这两种语法\\d\\d\\d和\\d{3}在所有环境中的工作方式是否相同?,java,regex,Java,Regex,请问这两个正则表达式之间有区别吗 \d\d\d与\d{3} 我已经用java和windows操作系统在我的本地机器上进行了测试,两种操作系统都运行正常,结果相同。但是,在linux环境中运行时,\d\d可以正常工作,而\d{3}不能。环境是这里的一个因素吗?或者,还有什么因素使这两个表达式在结果上有所不同 以下是代码片段: Pattern pattern = Pattern.compile( ".*aaa\\.bbb\\d{3}.ccc\\d{3}." ); Matcher matcher =
\d\d\d
与\d{3}
我已经用java和windows操作系统在我的本地机器上进行了测试,两种操作系统都运行正常,结果相同。但是,在linux环境中运行时,\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”模式下(以及在某些版本中在“Extended”模式下)运行
也就是说,我希望给定版本的Java的所有实现都能理解相同的正则表达式语言
这不是正则表达式。那是另外一种语言?NET?它们是等价的正则表达式。这一定与你执行它的方式有关。请(准确地)显示您的测试代码。顺便说一句@shiplu,这显然是java,所以我添加了java标记。正如@ikegami在下面指出的,regex的许多方言在细节上会有所不同。嗨@ikegami感谢您的回复。如果我理解正确,除非在perl模式下,否则在linux中无法识别这两个表达式(\\d\\d\\d和\\d{3})?为了在两种环境(linux和windows)中都能识别这两个表达式,您建议执行什么操作?Unix grep在扩展模式下理解
\d{3}
。在控制台上运行echo-e'123\nab3'|grep-e'\d{3}'
查看它的运行情况。它与操作系统无关。不同的工具(grep
vsjava
)有不同的匹配语言。echo-e'123\nab3'| grep-e'\d{3}'
没有为我返回任何内容。感谢@ikegami的解释。
$ grep - P '\d{3}' foo
123
$ grep -P '\d\d\d' foo
123