使用正则表达式在Java中拆分字符串数组
我正在尝试拆分此字符串: 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)] 这里是规则,它可以接受字母a到g,它可以是一个单独的字母,但如果后面有括号,它必须包含它们及其内容。括号的内容必须是数值 这就是我所尝试的:使用正则表达式在Java中拆分字符串数组,java,arrays,regex,split,Java,Arrays,Regex,Split,我正在尝试拆分此字符串: 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)] 这里是规则,它可以接受字母a到g,它可以是一个单独的字母,但如果后面有括号,它必须包含它们及其内容。括号的内容必须是数值 这就是我所尝试的: content = "aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)";
content = "aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)";
a = content.split("[a-g]|[a-g]\\([0-9]*\\)");
for (String s:
a) {
System.out.println(s);
}
这是输出
(二)
(52)
(4) (二)
(14) (6)(8)h(4)5(6)
谢谢。匹配这些子字符串更容易:
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-g]
到a
g
-一个可选的非捕获组,匹配1次或0次(?:\(\d+\)?
-a\(
字符(
-1+位\d+
-a\)
字符)
- 拆分是错误的方法,因为很难消除错误条目
只要“匹配”,只要是有效的,就可以处理找到的匹配结果数组:
[a-g](?:\(\d+\))?
您可以尝试以下正则表达式:
[a-g](\(.*?\)?
:需要从a到g的字母[a-g]
:介于(\(.*)?
和(
之间的任意字符数,匹配次数尽可能少)
模式
,例如:
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-g](?:\(.*))?
还可以轻松提取括号的内部值:
while (matcher.find()) {
tokens.add(matcher.group());
tokens.add(matcher.group(1)); // the inner value or null if no () are present
}
如果您只想使用拆分方法,这里有一种方法您也可以遵循
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)]
注意:这种方法只适用于已知输入字符串中不存在的分隔符。例如,我选择冒号是因为我假设它不是输入字符串的一部分。它确实匹配所需的模式。。。但这对我来说是行不通的split@mettleap你说得对,我补充了更多细节来描述我是如何解决这个问题的。谢谢你的指点!谢谢,效果很好。也谢谢你提供的细节,我现在明白了。
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, b, a(2), b, b(52), g, c(4), d(2), f, e(14), f(6), g(8), h(4)5(6)]