根据模式拆分字符串

时间:2011-05-06 14:30:20

标签: java regex

我有一个模式为(ab)(bc)(ca)abc的字符串。现在如果()存在,那么我需要按如下方式进行插入:

pattern (ab)(bc)(ca)  OP A=ab B= bc C= ca
pattern abc           OP A=a  B=b   C=c
parrtern (abc)b c     OP A=abc B=b  c= c
parrtern a (bb) c     OP A=abc B=bb  c= c

如何使用正则表达式来分割字符串?

3 个答案:

答案 0 :(得分:3)

这是一种方法。并不是真的“一分为二”,但这可能就是我要做的。

String[] tests = {"(ab)(bc)(ca)", "abc", "(abc)b c", "a (bb) c" };

Pattern p = Pattern.compile("\\s*(\\(.*?\\)|.)\\s*");

for (String test : tests) {
    Matcher m = p.matcher(test);

    System.out.println("Test: " + test);
    while (m.find())
        System.out.println("   Part: " + m.group().replaceAll("[() ]", ""));

    System.out.println();
}

<强>输出:

Test: (ab)(bc)(ca)
   Part: ab
   Part: bc
   Part: ca

Test: abc
   Part: a
   Part: b
   Part: c

Test: (abc)b c
   Part: abc
   Part: b
   Part: c

Test: a (bb) c
   Part: a
   Part: bb
   Part: c

这样的事情甚至可能会发生(我可能已经利用了你的“真实”问题中不存在的你的例子的属性。我讨厌当人们用我的问题做这件事时,所以如果是这样的话,我会事先道歉!):

String[] tests = {"(ab)(bc)(ca)", "abc", "(abc)b c", "a (bb) c" };

for (String test : tests) {

    String[] parts = test.length() == 3
        ? test.split("(?<=.)")
        : test.replaceAll("[()]", " ").trim().split("\\s+");

    System.out.printf("Test: %-16s   Parts: %s%n", test, Arrays.toString(parts));
}

<强>输出:

Test: (ab)(bc)(ca)       Parts: [ab, bc, ca]
Test: abc                Parts: [a, b, c]
Test: (abc)b c           Parts: [abc, b, c]
Test: a (bb) c           Parts: [a, bb, c]

答案 1 :(得分:2)

结帐String.split(..);

答案 2 :(得分:2)

您可以使用GuavaSplitter课程。它可以分为许多不同的东西。

(或者直到问题更新后我想到了更多信息)


Arg,现在你添加了信息,我认为没有任何Split方法可以帮助你。但是,这将是:

String s = " (abc)b c";
Matcher matcher = Pattern.compile("(?<=\\()[a-z]{2,}(?=\\))|[a-z]").matcher(s);
while (matcher.find()){
    System.out.println(matcher.group());
}

现在,如果您需要数组或集合中的项目,只需将System.out.println()调用替换为更合理的内容。

<强>输出:

abc
b
c

模式解释:

(?<=\\()  // match after an opening parenthesis
[a-z]{2,} // match two or more letters
(?=\\))   // match before closing parenthesis
|         // or
[a-z]     // match a single letter