问题描述
|
我希望:
\\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\"
那么,如何使我的正则表达式起作用?
解决方法
问题在于,
\\b
在单词字符和非单词字符之间匹配,而不是您似乎正在尝试的在空格和非空格之间匹配。 .
和0
之间的区别在于,0
被视为\“ word \”字符,而.
则不是。
因此,您的示例中发生的是这样的:
让我们取最后一个字符串ab..
,看看\\b
可以匹配的位置:
a b . .
^ x ^ x x
请记住,\\b
字符之间匹配。我已经说明了\\b
可以与^
匹配,而where4ѭ可以与x
匹配。由于\\b
只能匹配a
之前或match18ѭ之后,因此我们只限于匹配ab
,只要其中有那些\\b
位即可。
我想你想要类似\\bab\\.?(?!\\S)
的东西。那就是“单词边界,然后是a
,然后是b
,然后可能是单个点,紧随其后的是一个非空格字符。”
如果我误解了您的问题,并且您确实希望表达式在字符串ab.c
中找到ab.
或在abc
中找到ab
,则可以进行\\bab\\.?(?!\\.)
,
\\b([a-zA-Z]+\\.+)\\b
是\“至少一个字母后跟至少一个点
“ 30”是“至少一个字母后跟零个或一个点”