使用正则表达式仅匹配包含给定字符的2对或2的幂的字符串

时间:2016-03-03 04:58:59

标签: regex formal-languages

我希望你的帮助为此创建一个正则表达式,我无法找到完成它的逻辑,我对正则表达式几乎一无所知。

正则表达式应该接受这些字符串(包含一对数量的“a”):

aba (2)
aa  (2)
ababababaa (6)
aabbaba (4)
...

否定:

bb (0)
aaa (3)
bab (1)
aabbabaa (5)
bbbbbbbaaaaaaabababb (9)
...

非常感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:0)

你可以形成正则表达式,确保你有2 a个字符,并为每个组合组合多个正则表达式(只要它允许non-a字符)

$ sed -n -r '/^(a[^a]?a|[^a]?aa|aa[^a]?|[^a]a[^a]a|a[^a]a[^a]|[^a]a[^a]a[^a])+$/ p'
aba
aba
aa
aa
ababababaa
ababababaa
aabbaba
aabbaba
bb
aaa
bab
aabbabaa
bbbbbbbaaaaaaabababb
$

因此,正则regex确保您在字符串中拥有偶数a个字符。

注意:符合条件的行打印两次,而不打印一次。而不是[^a],您只能使用b

答案 1 :(得分:0)

逻辑可以简单:

  1. 从头开始匹配任意长度的非a
  2. 之间和之后匹配一对[^a]*(a[^a]*a[^a]*)+与任意非{{1}}
  3. 无限期地重复(2)至少出现一次
  4. 正则表达式:

    {{1}}

    注释:

    [^a]*           # Match arbitrary length non-a
    (a[^a]*a[^a]*)  # Match a pair of a with anything in between and after
    +               # Repeat the previous with at least one occurrence
    

答案 2 :(得分:0)

优化

var r= "aaaaabbabbbbaa".match(/(.)\1{0,}/g);

    var count=0;
    var startCharMustBe='a';
    for (i = 0; i < r.length; i++) {    
         if(r[i].length>0 && r[i][0]==startCharMustBe)
         {
           count=count+r[i].length;
         }
    }
    alert(count);

<强>动态

var r= "aaaaabbbbbbaa".match(/(.)\1{0,}/g);

var index=new Array();
var isExist=false;
var startChar;
for (i = 0; i < r.length; i++) {    
     startChar='';
     isExist=false;
     if(r[i].length>0)
     {
       startChar=r[i][0];
     }

    for(ii=0;ii<index.length;ii++)
    {
        if(startChar==index[ii].C)
        {
          index[ii].length=index[ii].length+r[i].length;    
          isExist=true;       
          break;
        }           
    }   

    if(!isExist)
    {

     var t= {"C":startChar,"length":r[i].length};
     index.push(t);
    }
}

for(ii=0;ii<index.length;ii++)
{
  alert(index[ii].C +" "+index[ii].length);
}

alert(r);