2

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

b
abab
babab

但不是

bb
babb
aaaba
abaaba

目前我有a(b)|b(a)并且它正在为abab. 我缺少第一个和最后一个字母,例如bor babab

所以我需要a单独或b单独或在单词末尾指定一个字母(如果它之前的字母不是它本身)。但我不知道该怎么做。

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

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

* ? +

|

()

.

多谢你们!,

我想如果不能在http://www.rexv.org/上指定字符串的开头和结尾以使其正常工作是不可能的

4

4 回答 4

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?))

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

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

于 2012-12-04T05:48:16.943 回答
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
于 2012-12-04T05:47:56.737 回答
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 等。

于 2012-12-04T05:57:33.480 回答
0

试试这个:

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

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

于 2012-12-04T06:11:46.150 回答