在Java正则表达式中,我应该能够在单词边界内引用前导或尾随的美元符号($)吗?

在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

在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.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
,来决定什么是单词字符,什么不是。