我正在尝试拔出所有具有偶数个B和奇数个C的字符串。我有正则表达式匹配奇数A和甚至B,但我不能让两者一起工作。字符串由空格(制表符,换行符,空格)分隔。
e.g。
XABBAC ABCDEBCC ABSDERERES ABBAAJSER HGABAA
我有奇怪的A's
\b[^A]*A([^A]*A[^A]*A)*[^A]*\b
甚至是B的
\b[^B]*(B[^B]*B[^B]*)*[^B]*\b
我知道我需要使用+ ve lookahead并尝试过:
\b(?=[^A]*A([^A]*A[^A]*A)*[^A]*\b)[^B]*(B[^B]*B[^B]*)*[^B]*\b
但它不起作用 - 有人知道为什么吗?
答案 0 :(得分:1)
问题是你的正则表达式(regexen?)可以匹配零个字符 - \b\b
将匹配单个字边界,\b{someregexthatcanmatchzerocharacters}\b
也是如此。
答案 1 :(得分:1)
正如Anon已经提到的:您的模式匹配空字符串,导致m.find()
永远不会在目标字符串中前进。所以,你需要让你的偶B
实际上匹配包含2,4,6,......数B
'的字符串。如果需要,您可以在偶数B
和[^B\\s]+
之间切换:B
(与包含0 String text = "XABBAC ABCDEBCC ABSDERERES ABBAAJSER HGABAA";
String oddAs = "\\b[^A\\s]*A([^A\\s]*A[^A\\s]*A)*[^A\\s]*\\b";
String evenBs = "\\b([^B\\s]*(B[^B\\s]*B[^B\\s]*)+|[^B\\s]+)\\b";
Pattern p = Pattern.compile(String.format("(?=%s)(?=%s)\\S+", oddAs, evenBs));
Matcher m = p.matcher(text);
while (m.find()) {
System.out.println(m.group());
}
的字符串相匹配)。只要你真正匹配一个或多个角色,那么你应该没问题。
此外,你不希望向前看,让否定的类匹配空格:这样你得到的匹配太多了。
尝试这样的事情:
ABCDEBCC
ABBAAJSER
产生:
{{1}}
答案 2 :(得分:1)
使用commons.lang.StringUtils它更简洁:
String data = "XABBAC ABCDEBCC ABSDERERES ABBAAJSER HGABAA";
String[] items = data.split("\\s+");
for(String item: items ) {
if (countMatches(item, "B") % 2 == 0
&& countMatches(item, "C") % 2 != 0) {
System.out.println( item );
}
}
答案 3 :(得分:0)
正则表达式被高估
String str = "XABBAC ABCDEBCC ABSDERERES ABBAAJSER HGABAA";
String[] s = str.split("\\s+");
for (int j=0 ;j< s.length;j++) {
int countC=0 ;
int countB=0;
for(int i=0;i<s[j].length();i++){
char c = s[j].charAt(i) ;
if (c == 'C') countC++;
if (c == 'B') countB++;
}
if ( (countC % 2) != 0 )
System.out.println( s[j] + " has odd C");
if ( (countB % 2) == 0 )
System.out.println( s[j] + " has even B");
}