RegEx - 不解析句子末尾的点(。)

时间:2016-02-04 21:34:30

标签: c# regex

C#.Net4.5

我有以下regEx表达式

^([0-9A-Z.]?[0-9a-z.]*\b\s*)+$

这应该做的是匹配一个句子,句子中的单词可能在单词的开头有一个大写但不在第一个单词之后,并且在句子中的任何地方都可以有一个点(。)。

表达单词的内容如下

  • 本作品
  • Th.is Wo.rks

但如果点位于单词的末尾

,则不起作用
  • 不起作用。
  • 此。不起作用

如果点(。)位于单词的末尾,为什么这不起作用?

3 个答案:

答案 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]+)+$

Formatted and tested:

 ^                     # 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时,模式将匹配单词

中间带大写字母的单词