如何用正则表达式计算奇数和偶数的字符?

时间:2011-01-20 22:19:41

标签: regex

我正在尝试拔出所有具有偶数个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

但它不起作用 - 有人知道为什么吗?

4 个答案:

答案 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");
    }