我有这个正则表达式
Pattern pa = Pattern.compile("\\b(\\$|hello|world|foo|blah blargh)\\b");
Matcher m = pa.matcher("$");
boolean b = m.matches();
System.out.println(b);
这打印出错误,但我不确定原因。
为什么?
https://coderpad.io/GWFMKYQQ - > coderpad如果它有帮助。
答案 0 :(得分:1)
关键是\b
字边界不明确:当字符(即字母,数字或下划线)出现时,下一个字符必须是非字的或者字符串的结尾。当\b
代表非单词字符时,它需要在其后面出现一个单词字符,也不包括字符串的结尾。
因此,如果您的意图是仅在未附加字词字符时匹配$
,请使用明确 (?<!\w)
和(?!\w)
外观:
Pattern pa = Pattern.compile("(?<!\\w)(\\$|hello|world|foo|blah blargh)(?!\\w)")
如果(?<!\w)
前面带有单词字符, $
将无法匹配,如果(?!\w)
后跟单词字符,则$
否定前瞻会使匹配失败
注意:如果您添加(?U)
(或Pattern.UNICODE_CHARACTER_CLASS
标志),\w
和\b
将变为支持Unicode(可能很重要)在某些情况下)。
答案 1 :(得分:0)
我对此进行了一些研究,事实证明,\b
元字符不喜欢美元符号。您可以使用常规符号在空格后匹配美元符号表达如下:
Pattern.compile("(\\s|^)\\$")
用另一个正则表达式修剪前面的空格:
Pattern.compile("\\S+")
或者,因为这是Java,而不是JavaScript的crap正则表达式引擎,所以你可以使用它:
Pattern.compile("(?<=\\s)\\$")