如何在Java中匹配正则表达式与美元金额和短语?

时间:2016-06-01 00:03:58

标签: java regex

我有这个正则表达式

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如果它有帮助。

2 个答案:

答案 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)\\$")