匹配点/句点如果不遵循并且前面有单个字符

时间:2014-01-10 00:25:16

标签: regex regex-lookarounds

所以我知道我需要使用前瞻和后瞻的东西,但我开始失去理智。

因此,您能提供一个例子,并解释它的含义。

我需要按照以下顺序匹配点,但不要在各个字符之间匹配。

this.is.a.sentence.e.g.

删除匹配的点时,应该留下:

this is a sentence e.g

答案需要在各种不同的正则表达式引擎中工作,所以通用的东西是首选,但如果它更容易,我相信我可以从基于.NET的工具中解决它。

1 个答案:

答案 0 :(得分:3)

Lookbehinds并未得到广泛支持,您的要求使其难以使用。也许一个优秀的正则表达式大师可以提供一个不使用它们的解决方案,但现在这就是我所拥有的:

(?:        # do not capture
 ^         # anchor to start of line
 |         # alternation
 (?<=      # lookbehind
  [^.]{2}  # two non-period characters
 )
)
\.         # a literal period
|          # alternation
\.         # a literal period
(?:        # do not capture
 $         # anchor to end of line
 |         # alternation
 (?=       # lookahead
  [^.]{2}  # two non-period characters
 )
)

基本上,这会进行两次交替检查:一个句点前面是行或两行非句点字符 一段时间后面跟着行两行非句号字符。

这适用于您的具体示例:http://rubular.com/r/3ueTN37Smh

您也可以通过这种方式处理替换:

s/(^|[^.]{2})\.|\.($|[^.]{2})/\1 \2/

这会捕获两个前面或后面的字符,并将它们作为匹配的一部分插回。它更简单,可能适用于更多语言。