JAVA中的正则表达式最多只有一个点

时间:2011-06-14 15:13:23

标签: java regex

我希望:\b([a-zA-Z]+\.?)\b or \b([a-zA-Z]+\.{0,1})\b可以至少一个字母,最多一个点。

但匹配器发现“ab”的输入为“ab”“ab”。和“ab ..”我希望它能做到以下几点:

"ab" is found for input "ab"
"ab." is found for input "ab."
nothing is found for input "ab.."

如果我将正则表达式替换为0而不是点,例如\b([a-zA-Z]+0?)\b比预期更有效:

"ab" is found for input "ab"
"ab0" is found for input "ab0"
nothing is found for input "ab00"

那么,我如何让我的正则表达式工作?

2 个答案:

答案 0 :(得分:5)

问题是\b在单词字符和非单词字符之间匹配,而不是在您尝试的空白和非空白之间。 .0之间的区别在于0被视为“字”字符,但.不是。

所以你的例子中发生了什么:

我们取最后一个字符串ab..并查看\b可以匹配的位置:

   a b . .
  ^ x ^ x x

请记住,\b匹配字符。我已经显示了\b^匹配的位置,以及x无法匹配的位置。由于\b只能在a之前或b之后匹配,因此只要您拥有ab位,我们就只能匹配\b在那里。

我认为你想要像\bab\.?(?!\S)这样的东西。那说“单词边界,然后a然后b然后可能是一个点,紧接着没有非空格字符。”

如果我误解了您的问题,并且您确实希望表达式在字符串ab.中找到ab.c或在ab中找到abc,您可以\bab\.?(?!\.) 1}}

答案 1 :(得分:0)

  • \b([a-zA-Z]+\.+)\b是“至少一个字母,后跟至少一个点
  • \b([a-zA-Z]+\.{0,1})\b是“至少一个字母后跟零或一个点