正则表达式 - 包含偶数个字符和其他字符的字符串

时间:2014-09-04 17:27:19

标签: regex

我正在完成我的作业,似乎无法弄清楚如何做到这一点。

假设字母是{a,b,c},我们想要一个表达式,找到偶数个c s的字符串。

包含的示例字符串:

empty set,
ccab
abcc
cabc
ababababcc

依此类推..只是偶数的c。

5 个答案:

答案 0 :(得分:0)

您可以使用此正则表达式仅允许输入中的c#:

^(?=(([^c\n]*c){2})*[^\nc]*$)[abc]*$

RegEx Demo

答案 1 :(得分:0)

以下正则表达式将匹配偶数c的字符串

^(?:[^c]*c[^c]*c[^c\n]*)+?$

DEMO

OR

^(?:[ab]*c[ab]*c[ab]*)+?$

DEMO

答案 2 :(得分:0)

假设c的计数总数不是连续的c s - there is a nice theoretical approach, based on the fact that **a string with an even number of c,可以表示为具有两个状态**的有限状态自动机。

第一个状态是初始状态,它也是一个接受状态。第二个是拒绝国家。每个c在州之间切换。其他字母什么都不做。

enter image description here

现在,您可以使用one of the methods described here将此简单计算机转换为正则表达式。

答案 3 :(得分:0)

这样的东西
^([^c]*(c[^c]*c)+)*[^c]*$

应该这样做。我们可以解决它,因此:

^          # - start-of-line, followed by
(          # - a group, consisting of
  [^c]*    #     - zero or more characters other than 'c', followed by
  (        #     - a group, consisting of
    c      #         - the literal character 'c', followed by
    [^c]*  #         - zero or more characters other than 'c', followed by
    c      #         - the literal character 'c'
  )+       #       repeated one or more times
)*         #   repeated zero or more times, followed by
[^c]*      # - a final sequence of zero or more characters other than 'c', followed by
$          # - end-of-line

有人可能会注意到类似下面的C#方法可能会表现得更好并且更容易理解:

public bool ContainsEvenNumberOfCharacters( this string s , char x )
{
  int cnt = 0 ;
  foreach( char c in s )
  {
    cnt += ( c == x ? 1 : 0 ) ;
  }
  bool isEven = 0 == (cnt&1) ; // it's even if the low-order bit is off.
  return isEven ;
}

答案 4 :(得分:0)

简单地

/^(([^c]*c[^c]*){2})*$/

英文:

  

零个或多个字符串,每个字符串恰好包含c的两个实例,前面或后跟任意数量的非c。

这种解决方案的优势在于它可以很容易地扩展到具有多个c等的c的字符串的情况,并且不对字母表做出任何假设。