正则表达式PCRE,字母a,b,应匹配没有连续字符的单词

时间:2012-12-04 05:37:46

标签: regex

我正在尝试构建一个应该匹配的正则表达式。

b
abab
babab

但不是

bb
babb
aaaba
abaaba

目前我有a(b)|b(a),它正在为abab工作。我错过了第一个和最后一个字母,例如bbabab

所以我需要单独指定a或单独指定b或在单词的末尾指定一个字母(如果前面的字母本身不是)。但我无法弄清楚如何做到这一点。

我正在使用http://www.rexv.org/(Perl PCRE)进行尝试。

谢谢你们,但我忘了提到: 空字符串也可以匹配, 我只能使用以下

* ? +

|

()

.

谢谢你们!,

我认为如果不能指定字符串的开头和结尾才能在http://www.rexv.org/

正常工作,那是不可能的

4 个答案:

答案 0 :(得分:2)

尝试这样的事情:

^((?:(?:ab)*a?)|(?:(?:ba)*b?))$

说明:

^(                   # beginning of the string
    (?:
        (?:ab)*      # matches any repeating `ab` group
        a?           # group can optionally end with an `a`
    )
    |
    (?:
        (?:ba)*      # matches any repeating `ba` group
        b?           # group can optionally end with a `b`
    )
)$                   # end of the string

我使用围绕整个正则表达式的完整捕获组将子组作为非捕获与前导(?:包括在内。这将确保只返回匹配的全字符串而不是每个子组的噪音。

这种方法的警告是“空”字符串也将匹配。

更新(有限的字符集)
您的有限字符集仍然适用于我上面的模式,但是,我们需要删除不匹配的组部分(?:)。正则表达式将最终为:

(((ab)*a?)|((ba)*b?))

上面提到的警告是它也会匹配一个空字符串,但是,这似乎是你需要的,所以我们可以将它添加到奖金列表中!

您可以使用的字符集的一个小问题是,您不能分别使用指示字符串开头和结尾的^$字符。这样做的问题是,匹配的任何子模式(无论您使用哪个正则表达式)都会将输入标记为有效。我假设这是考虑到的。

答案 1 :(得分:0)

修改: -

如果您不想使用look-aheadlook-behind断言,可以使用此正则表达式: -

"b?(ab)*|a?(ba)*"  // Will also match `empty string`

说明: -

b?   // 0 or 1 b
(    // capture group. 
  ab // Match ab
)*   // group close `0 or more repetition

|

a?(ba)*  // Same with `a` replaced with `b`, and `b` with `a`

旧答案: -

使用此正则表达式: -

"((?<!a)a|(?<!b)b)*"   // This will also match empty string

匹配a之前没有其他a。与b相同。

(            // Capture group
    (?<!     // Negative Look-behind assertion
        a    // on a
    )
     a       // Match a

    |        // or

    (?<!     // Negative Look-behind assertion
        b    // on b
    )
     b       // Match b
)                 // Close capture group
+  // 1 or more repetition

答案 2 :(得分:0)

不是构建复杂的匹配正则表达式,而是使用简单的正则表达式来匹配重复的字符,并使用相反的字符:

    String stringToMatch = "babaab";
    Pattern p1 = Pattern.compile("^[ab]+$");//match the a`s and b`s kind of string
    Pattern p2 = Pattern.compile("([ab])\\1+");//match the repeating a`s and b`s
    Matcher m1 = p1.matcher(stringToMatch);
    Matcher m2 = p2.matcher(stringToMatch);
    if (m1.find() && !m2.find()){//validates it has a's and b's but not repeating
       //valid string
    }

要匹配任何单词字符,只需使用:(\\w)\\1+。这是最好的部分。 简单且可扩展以覆盖更多字符集,例如abcdabcd等。

答案 3 :(得分:0)

试试这个:

^((b?(ab)*a?)|(a?(ba)*b?))$

这假定您的字母表仅限于{a, b}