Java 如何使用正则表达式基于模式拆分字符串

Java 如何使用正则表达式基于模式拆分字符串,java,regex,Java,Regex,我无法根据正则表达式拆分字符串 String str = "1=(1-2,3-4),2=2,3=3,4=4"; Pattern commaPattern = Pattern.compile("\\([0-9-]+,[0-9-]+\\)|(,)") ; String[] arr = commaPattern.split(str); for (String s : arr) { System.out.println(s); } 预期产量 1=(1-2,3-4) 2=2 3

我无法根据正则表达式拆分字符串

String str = "1=(1-2,3-4),2=2,3=3,4=4";
Pattern commaPattern = Pattern.compile("\\([0-9-]+,[0-9-]+\\)|(,)") ;
String[] arr = commaPattern.split(str);
for (String s : arr)
{
    System.out.println(s);
}
预期产量

1=(1-2,3-4)     
2=2    
3=3    
4=4
实际产量,

1=

2=2
3=3
4=4
应该是

String[] arr = str.split(commaPattern);

你必须在这里使用一些前瞻机制。正如我所看到的,你们试图用不在括号中的逗号来分割它。但是你的正则表达式说:

Split on comma OR on comma between numbers in parenthesis 
所以你的字符串被分成4个部分 1) (1-2,3-4)
2-4)逗号

此正则表达式将根据需要拆分

,(?![^()]*\\))
  ------------
      |->split with , only if it is not within ()

这不太适合
拆分(…)
。考虑通过输入和<代码>匹配< < /代码> ING扫描:

String str = "1=(1-2,3-4),2=2,3=3,4=4";

Matcher m = Pattern.compile("(\\d+)=(\\d+|\\([^)]*\\))").matcher(str);

while(m.find()) {
  String key = m.group(1);
  String value = m.group(2);
  System.out.printf("key=%s, value=%s\n", key, value);
}
将打印:

key=1, value=(1-2,3-4)
key=2, value=2
key=3, value=3
key=4, value=4

否,因为
commapatern
不是正则表达式字符串。即使你传递字符串,这也不能解决正则表达式的问题。正则表达式也不能帮你解决这个问题。你需要一个解析器。你需要一个解析器。@Bohemian对于这样一个简单的问题没有必要使用解析器。。解析器会是个大麻烦。你能解释一下吗?例如,为什么将
\\)
视为量词的一部分而不是字符?为什么
,?!([^()]*\\)
不起作用?谢谢@JingHe从我记忆中可以看出,
是通过前瞻性匹配的。通过向前看,正则表达式引擎不会使用字符,就像布尔条件一样,因此它不会使用字符并向前移动,而是会检查条件是否为真。这是必需的,因为如果您尝试在不使用lookaheads的情况下拆分,它也会在匹配的内容上拆分``
key=1, value=(1-2,3-4)
key=2, value=2
key=3, value=3
key=4, value=4