C#.Net4.5
我有以下regEx表达式
^([0-9A-Z.]?[0-9a-z.]*\b\s*)+$
这应该做的是匹配一个句子,句子中的单词可能在单词的开头有一个大写但不在第一个单词之后,并且在句子中的任何地方都可以有一个点(。)。
表达单词的内容如下
但如果点位于单词的末尾
,则不起作用如果点(。)位于单词的末尾,为什么这不起作用?
答案 0 :(得分:2)
如果点(。)位于单词的末尾,为什么这不起作用?
\b
与单词边界匹配,在此之后你没有一段时间,所以你不会在单词结尾处获得句号。
这似乎更接近:
^([0-9A-Z.]?[0-9a-z.]*(?:\b|\s)\.*)+$
我已经添加了一个或用于单词边界和空格\b|\s
并在那里放了一段时间。
matches所有4个样本行。
这看起来更干净:
^([0-9A-Z.]?[0-9a-z.]*\s*)+$
(Example)
答案 1 :(得分:1)
由于字符受限制,因此您不需要字边界\b
到[A-Za-z.\s]
为什么不保持简单,只强制[A-Z]
只能存在于空白中
边界。 (下面,为了简洁,\s
已替换为\h
^\h*(?:(?<!\S)[A-Z]|[\da-z.\h]+)+$
^ # BOS
\h* # Optional leading whitespace
(?: # Cluster group start
(?<! \S ) # Whitespace boundary before capital
[A-Z] # Single capital letter
| # or,
[\da-z.\h]+ # Multiple digits, lower case letters, dots or whitespace
)+ # Cluster group end, do 1 to many times
$ # EOS
答案 2 :(得分:0)
感谢您的帮助。我相信我终于有了答案
^(\s*[0-9A-Z.]?[0-9a-z.]*\b\s*[.|\s]*)+$
我需要\ b的原因是因为我需要模式与单词中间有大写字母的单词不匹配。当删除/ b时,模式将匹配单词
中间带大写字母的单词