如何匹配多个字符的单词?

时间:2009-05-05 14:33:10

标签: c# regex

我想使用正则表达式将所有单词与多于一个字符匹配,而不是完全由相同字符组成的单词。

这不应该匹配:ttttt,rrrrr,ggggggggggggg

这应该匹配:rttttttt,word,wwwwwwwwwu

5 个答案:

答案 0 :(得分:6)

以下表达式可以解决问题。

^(?<FIRST>[a-zA-Z])[a-zA-Z]*?(?!\k<FIRST>)[a-zA-Z]+$
  • 将第一个字符捕获到组FIRST
  • 捕捉更多角色(懒洋洋地避免回溯)
  • 使用否定前瞻断言确保下一个字符与FIRST不同
  • 捕获所有(至少一个由于断言)剩余的字符

注意,足以查找与第一个字符不同的字符,因为如果没有字符与第一个字符不同,则所有字符都相等。

您可以将表达式缩短为以下内容。

^(\w)\w*?(?!\1)\w+$

这将匹配[a-zA-Z]以外的其他一些字符。

答案 1 :(得分:1)

我会将所有唯一的单词添加到列表中,然后使用此正则表达式

  

\ B(\ w)的\ 1+ \ B'/ P>

抓住所有一个字符并摆脱它们

答案 2 :(得分:1)

这不使用正则表达式,但我相信它可以满足您的需求:

public bool Match(string str)
{
    return string.IsNullOrEmpty(str)
               || str.ToCharArray()
                     .Skip(1)
                     .Any( c => !c.Equals(str[0]) );
}

答案 3 :(得分:0)

以下RE将与您要求的相反:匹配单词由同一个字符组成。尽管如此,它可能仍然有用。

\b(\w)\1*\b

答案 4 :(得分:0)

\b\w*?(\w)\1*(?:(?!\1)\w)\w*\b

\b(\w)(?!\1*\b)\w*\b

这假设你从一些较大的文字中剔除了这些文字;这就是为什么它需要单词边界和填充。如果你有一个单词列表,并且你只是想验证符合条件的单词,那么可能会有一个更简单的正则表达式:

(.)(?:(?!\1).)

...因为你已经知道每个单词只包含单词字符。另一方面,根据您对“单词”的定义,您可能需要使用更具体的内容替换前两个正则表达式中的\w,例如[A-Za-z]