正则表达式处理单词中的点 (.)

use*_*276 1 c# regex

我在正则表达式上遇到了困难。

唯一的要求是,如果单词中有一个点(.),则该点的两侧必须有一个字母。单词中可以有任意数量的点,点之间可以有任意数量的字母。点的两侧必须有一个字母。

我已经大部分弄清楚了,但我遇到了仅由一个字母分隔的点的问题(请参见下面的示例)

目前我有这样的表达:

^(\s*[0-9A-Za-z]{1,}[.]{0,1}[0-9A-Za-z]{1,}\s*)+$
Run Code Online (Sandbox Code Playgroud)

这适用于以下情况:

  1. 点.InWord
  2. Word 中的多个点
  3. d.ot.s
  4. 两个Le.tt.er.sB.et.we.en.do.ts

但是,如果点仅由一个字母分隔,则这不适用于单词,如下所示:

  1. 点仅分隔一个.eLetter

有人知道我该如何解决这个问题吗?

编辑:

下面的 BHustus 解决方案是更好的解决方案。

然而,我确实采用了 BHustus 所展示的内容,并将其与我之前的内容相结合,想出了一个不那么“令人困惑”的模式,以防其他人感兴趣。

^(\s*[\d\w]+([.]?[\d\w]+)+\s*)+$
Run Code Online (Sandbox Code Playgroud)

关键是要有 . 后面的 1 个单词在自己的组中并重复。([.]?[\d\w]+)+

谢谢。

Mut*_*pus 5

([\w]+\.)+[\w]+(?=[\s]|$)

解释:

括号中的第一组匹配 1 个或多个字母或数字(\w是 的简写形式[A-Za-z0-9]+表示“匹配前面的一次或多次”,是 的简写形式{1,}),后跟一个句点。在匹配了一个或多个循环后[\w]+\.,final[\w]+会确保末尾至少有一个字母,并消耗所有字符,直到到达非字符。最后,这(?=[\s]|$)是一个先行断言,确保前面有空格 ( [\s]) 或字符串末尾 ( $) (作为|正则表达式“OR”字符)。如果前瞻失败,则不匹配。

在线演示,展示您的所有测试用例