在Java正则表达式中,我应该能够在单词边界内引用前导或尾随的美元符号($)吗?
在Java(1.6.20)中,我很难让前导/尾随$的正则表达式匹配 根据该代码:在Java正则表达式中,我应该能够在单词边界内引用前导或尾随的美元符号($)吗?,java,regex,unicode,word-boundary,dollar-sign,Java,Regex,Unicode,Word Boundary,Dollar Sign,在Java(1.6.20)中,我很难让前导/尾随$的正则表达式匹配 根据该代码: System.out.println( "$40".matches("\\b\\Q$40\\E\\b") ); System.out.println( "$40".matches(".*\\Q$40\\E.*") ); System.out.println( "$40".matches("\\Q$40\\E") ); System.out.println( " ------ " ); System.out.prin
System.out.println( "$40".matches("\\b\\Q$40\\E\\b") );
System.out.println( "$40".matches(".*\\Q$40\\E.*") );
System.out.println( "$40".matches("\\Q$40\\E") );
System.out.println( " ------ " );
System.out.println( "40$".matches("\\b\\Q40$\\E\\b") );
System.out.println( "40$".matches(".*\\Q40$\\E.*") );
System.out.println( "40$".matches("\\Q40$\\E") );
System.out.println( " ------ " );
System.out.println( "4$0".matches("\\b\\Q4$0\\E\\b") );
System.out.println( "40".matches("\\b\\Q40\\E\\b") );
我得到以下结果:
false
true
true
------
false
true
true
------
true
true
前两个区块中的主要错误似乎就是问题所在。也就是说,未在\b(单词边界)标记的上下文中正确拾取前导/尾随$(美元符号)
块中的真实结果表明,它不是引用的美元符号本身,因为将\b替换为。*或将所有符号一起删除可以获得所需的结果
最后两个“true”结果表明,问题既不是内部引用的$,也不是引用表达式“\Q…\E”中的单词边界(\b)匹配
这是Java错误还是我遗漏了什么?这是因为
\b
匹配单词边界。紧靠$
字符前后的位置不一定算作单词边界
单词边界是\w
和\w
之间的位置,$
不是\w
的一部分。在字符串“bla$”的示例中,单词边界为:
" b l a $ "
^----------- here
" b l a $ "
^----- here
" b l a $ "
^--- but not here
这是因为
\b
匹配单词边界。紧靠$
字符前后的位置不一定算作单词边界
单词边界是\w
和\w
之间的位置,$
不是\w
的一部分。在字符串“bla$”的示例中,单词边界为:
" b l a $ "
^----------- here
" b l a $ "
^----- here
" b l a $ "
^--- but not here
Tomalak搞定了-这是关于单词边界匹配的。我已经弄明白了,并删除了这个问题,但威尔建议对其他人保持开放是合理的 事实上,
\b
就是罪魁祸首
一个结论可能是,除了最基本的(即ASCII)使用之外,Java内置的方便表达式实际上是无用的。例如,\w
仅匹配ASCII字符,\b
基于此,等等
FWIW,我的RegExp最终是:
(?:^|[\p{P}\p{Z}])(\QThe $earch Term\E)(?:[\p{P}\p{Z}]|$)
其中,$earch术语是我试图匹配的文本
\p{}
是Unicode类别。基本上,我是在标点符号(P
)或分隔符(Z
)Unicode字符类别中的任何字符上断字。此外,输入的开始和结束也得到尊重(使用^
和$
),边界标记被标记为非捕获组((?:…)
位)而实际的搜索词被引用为\Q
和\E
&放在一个匹配的组中。Tomalak确定了它-它是关于单词边界匹配的。我已经弄明白了,并删除了这个问题,但威尔建议对其他人保持开放是合理的
事实上,\b
就是罪魁祸首
一个结论可能是,除了最基本的(即ASCII)使用之外,Java内置的方便表达式实际上是无用的。例如,\w
仅匹配ASCII字符,\b
基于此,等等
FWIW,我的RegExp最终是:
(?:^|[\p{P}\p{Z}])(\QThe $earch Term\E)(?:[\p{P}\p{Z}]|$)
其中,$earch术语是我试图匹配的文本
\p{}
是Unicode类别。基本上,我是在标点符号(P
)或分隔符(Z
)Unicode字符类别中的任何字符上断字。同样,输入的开始和结束也会得到尊重(使用^
和$
),边界标记被标记为非捕获组((?:…)
位),而实际搜索词被引用为\Q
和\E
放在匹配组中。不要删除;只要给Tomalak留下正确的答案,或者如果你发现了什么,就澄清一下。帮助有相同问题并正在网上搜索的人。感谢您的提示,将在下面接受。不要删除;只要给Tomalak留下正确的答案,或者如果你发现了什么,就澄清一下。帮助有相同问题且正在网上搜索的用户。感谢您的提示,将在下面接受。\b
效果良好;你只是想在错误的地方使用它。而且\b
精通Unicode;它使用字符。IsleterOrdigit()
,而不是\w
,来决定什么是单词字符,什么不是。\b
工作正常;你只是想在错误的地方使用它。而且\b
精通Unicode;它使用字符.isleterOrdigit()
,而不是\w
,来决定什么是单词字符,什么不是。