正则表达式只能找到两组11

时间:2011-09-07 00:25:07

标签: regex

大家好我需要找一个正则表达式,它只接受两组11的字符串 从一组{0,1,2}

0011110000          match it only has two sets
0010001001100       does not match (only has one set)
0000011000110011    does not match (it has three sets)
00                  does not match (it has no set
0001100000110001    match it only has two sets

这是我到目前为止所做的事情

([^1]|1(0|2|3)(0|2|3)*)*11([^1]|1(0|2|3)(0|2|3)*)*11([^1]|1(0|2|3)(0|2|3)*|1$)*
                                                     --------------------------

我认为我缺少的是我需要确保上面正则表达式的下划线部分必须确保字符串中没有剩余的“11”,我不认为该部分是工作正常。

4 个答案:

答案 0 :(得分:3)

如果这不是作业,那么我建议避免使用正则表达式并使用常规函数(这里显示的是JavaScript):

function hasTwoElevensOnly(s) {
    var first = s.indexOf("11");
    if (first < 0) return false;
    var second = s.indexOf("11", first + 2);
    if (second < 0) return false;
    return s.indexOf("11", second + 2) < 0;
}

此处代码:http://jsfiddle.net/8FMRH/

function hasTwoElevensOnly(s) {
    return /^((0|1(?!1)|2)*?11(0|1(?!1)|2)*?){2}$/.test(s);
}

如果需要正则表达式,

COde:http://jsfiddle.net/PAARn/1/

答案 1 :(得分:3)

可以使用正则表达式,但是你可以使用更简单的选项。这是C#中的一个例子:

public bool IsValidString(string input)
{
   return input.Split(new string[] { "11" }, StringSplitOptions.None).Length == 3;
}

虽然正则表达式可能是一个非常有用的工具,但并不总是保证它们的使用。正如jwz put it

  

有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

答案 2 :(得分:1)

大多数正则表达式都有外观限制,通常在{}。例如,在JavaScript中,您可以执行以下操作:

/^((10|0)*11(01|0)*){2}$/

在字符串中以2 11为前缀,后缀为0 + 0

答案 3 :(得分:0)

可能有一种更简单的方法,但从您的方法开始,这似乎适用于所提供的样本数据:

/^([^1]|1[023])*11([^1]|1[023])*11((?<!11)|1[023]|[023]|(?<=[023])1)*$/

使用lookbehind。