我正在尝试分割此字符串:
aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)
所以看起来像这个数组:
[a,b,a(2),b,b(52),g,c(4),d(2),f,e(14),f(6),g(8)] < / p>
以下是规则,它可以接受字母 a到g ,也可以是单独的字母,但是如果后面带有括号,则必须包括它们及其内容。括号的内容必须为数字。
这是我尝试过的:
brew doctor
这是输出
(2)
(52)
(4)(2)
(14)(6)(8)h(4)5(6)
谢谢。
答案 0 :(得分:1)
匹配这些子字符串更容易:
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)]
请参见Java demo和regex demo。
模式详细信息
[a-g]
-从a
到g
的一封信(?:\(\d+\))?
-一个可选的非捕获组,匹配出现1或0次
\(
-一个(
字符\d+
-1个以上数字\)
-一个)
字符。答案 1 :(得分:1)
如果您只想使用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)]
注意:此方法仅适用于在输入字符串中不存在的定界符。例如,我选择一个冒号是因为我认为它不会成为输入字符串的一部分。
答案 2 :(得分:0)
答案 3 :(得分:0)
您可以尝试以下正则表达式:[a-g](\(.*?\))?
[a-g]
:需要从a到g的字母(\(.*?\))?
:(
和)
之间的任意字符,尽可能少地匹配您可以查看预期的输出here。
此答案基于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
}