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

时间:2016-03-22 19:03:16

标签: c# regex

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

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

我有很多想法,但我遇到的问题是只用一个字母分隔的点(见下面的例子)

目前我有这样的表达:

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

这适用于以下内容:

  1. dot.InWord
  2. Multiple.dots.In.Word
  3. d.ot.s
  4. t.wo.Le.tt.er.sB.et.we.en.do.ts
  5. 但是,如果点只用一个字母分隔,则不适用于单词,如下所示:

    1. d.o.t.s.O.n.l.y.S.e.p.e.r.a.t.e.d.B.y.O.n.e.L.e.t.t.e.r
    2. 任何人都知道如何解决这个问题?

      编辑:

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

      然而,我确实采取了BHustus所展示的内容,并将其与我之前所拥有的内容相结合,以提出一个更少"令人困惑的"模式以防万一其他人感兴趣。

      ^(\s*[\d\w]+([.]?[\d\w]+)+\s*)+$
      

      关键是拥有。并且在其自己的组中的1个单词并重复。 ([。] [\ d \ W] +)+

      感谢。

2 个答案:

答案 0 :(得分:2)

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

解释:

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

Online demo,显示所有测试用例

答案 1 :(得分:0)

你必须使用正则表达式吗?接受的答案的正则表达式很难阅读。一个简单的循环怎么样?

for(int i = 0; i < str.length; i++)
{
    char ch = str[i];
    if(ch == '.')
    {
        if(i == 0) return false; //no dots at start of string
        if(i == str.length - 1) return false; //no dots at end of string
        if(str[i + 1] == '.') return false; //no consecutive dots
    }
    else if(!IsLetter(ch) && !IsNumber(ch))
    {
        return false; //allow only letters and numbers
    }
}
return true;