我正在尝试构建一个应该匹配的正则表达式。
b
abab
babab
但不是
bb
babb
aaaba
abaaba
目前我有a(b)|b(a)
,它正在为abab
工作。我错过了第一个和最后一个字母,例如b
或babab
。
所以我需要单独指定a
或单独指定b
或在单词的末尾指定一个字母(如果前面的字母本身不是)。但我无法弄清楚如何做到这一点。
我正在使用http://www.rexv.org/(Perl PCRE)进行尝试。
谢谢你们,但我忘了提到: 空字符串也可以匹配, 我只能使用以下
* ? +
|
()
.
谢谢你们!,
我认为如果不能指定字符串的开头和结尾才能在http://www.rexv.org/
正常工作,那是不可能的答案 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-ahead
和look-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}
。