3 回答
TA贡献2021条经验 获得超8个赞
匹配这些子字符串更容易:
String content = "aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)";
Pattern pattern = Pattern.compile("[a-g](?:\\(\\d+\\))?");
List<String> res = new ArrayList<>();
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
res.add(matcher.group(0));
}
System.out.println(res);
输出:
[a, b, a(2), b, b(52), g, c(4), d(2), f, e(14), f(6), g(8)]
图案详情
[a-g]- 一封来自a于的信g(?:\(\d+\))?- 一个可选的非捕获组匹配 1 或 0 次出现\(- 一个(字符\d+- 1+ 位数字\)- 一个)字符。
TA贡献1810条经验 获得超4个赞
如果你只想使用 split 方法,这里有一个你也可以遵循的方法,
import java.util.Arrays;
public class Test
{
public static void main(String[] args)
{
String content = "aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)";
String[] a = content.replaceAll("[a-g](\\([0-9]*\\))?|[a-g]", "$0:").split(":");
// $0 is the string which matched the regex
System.out.println(Arrays.toString(a));
}
}
正则表达式:[a-g](\\([0-9]*\\))?|[a-g]匹配你想匹配的字符串(即a、b、a(5)等)
使用这个正则表达式,我首先用它们的附加版本(附加:)替换这些字符串。后来,我使用 split 方法拆分字符串。
上面代码的输出是,
[a, b, a(2), b, b(52), g, c(4), d(2), f, e(14), f(6), g(8), h(4)5(6)]
注意:此方法仅适用于已知不存在于输入字符串中的分隔符。例如,我选择了一个冒号,因为我认为它不会成为输入字符串的一部分。
TA贡献2037条经验 获得超6个赞
您可以尝试以下正则表达式: [a-g](\(.*?\))?
[a-g]: 需要从 a 到 g 的字母
(\(.*?\))?:(和之间的任何字符),尽可能少地匹配
您可以在此处查看预期的输出。
这个答案基于Pattern一个例子:
String input = "aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)";
Pattern pattern = Pattern.compile("[a-g](?:\\(\\d+\\))?");
Matcher matcher = pattern.matcher(input);
List<String> tokens = new ArrayList<>();
while (matcher.find()) {
tokens.add(matcher.group());
}
tokens.forEach(System.out::println);
结果输出:
a
b
a(2)
b
b(52)
g
c(4)
d(2)
f
e(14)
f(6)
g(8)
编辑:使用[a-g](?:\((.*?)\))?您还可以轻松提取括号的内部值:
while (matcher.find()) {
tokens.add(matcher.group());
tokens.add(matcher.group(1)); // the inner value or null if no () are present
}
添加回答
举报
