我有一个模式为(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
如何使用正则表达式来分割字符串?
答案 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)
您可以使用Guava的Splitter
课程。它可以分为许多不同的东西。
(或者直到问题更新后我想到了更多信息)
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