【问题标题】:Regex dealing with dots (.) within words正则表达式处理单词中的点 (.)
【发布时间】:2016-03-23 22:07:43
【问题描述】:

我很难使用正则表达式。

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

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

目前我有这样的表达方式:

^(\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

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

  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

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

编辑:

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

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

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

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

谢谢。

【问题讨论】:

  • 那么你到底想做什么?匹配由任意数量的字母分隔的任意数量的点的整个单词?
  • 是的,很抱歉,将问题编辑得更清楚
  • 字母之间可以有两个点吗?
  • 字母之间只有1个点

标签: c# regex


【解决方案1】:

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

解释一下:

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

Online demo,显示你所有的测试用例

【讨论】:

  • 这种方式可行,谢谢 BHustus。也感谢您的解释:)
【解决方案2】:

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

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;

【讨论】:

  • 嗨,是的,它必须是正则表达式模式,但如果我不必使用它,这是一个不错的选择。
猜你喜欢
  • 2018-04-05
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
相关资源
最近更新 更多