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
4

4 に答える 4

5

この正規表現は必要に応じて分割されます

,(?![^()]*\\))
  ------------
      |->split with , only if it is not within ()
于 2013-03-29T08:01:30.400 に答える
3

これは a にはあまり適していませんsplit(...)。代わりに、入力をスキャンしてmatching することを検討してください。

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
于 2013-03-29T08:13:53.253 に答える
1

ここでは、先読みメカニズムを使用する必要があります。ご覧のとおり、括弧で囲まれていないコンマで分割しようとしています。しかし、あなたの正規表現は次のように言っています:

Split on comma OR on comma between numbers in parenthesis 

したがって、文字列は 4 つの場所に分割されます 1) (1-2,3-4) 2-4) コンマ

于 2013-03-29T07:54:19.153 に答える
-4
String[] arr = commaPattern.split(str);

する必要があります

String[] arr = str.split(commaPattern);
于 2013-03-29T07:47:03.007 に答える