2016-03-23 7 views
2

は、私は次の正規表現を使用して、String.split(regexp)法により"01.02.2016""0"に文字列"[01.02.2016][0][]"を解析しよう:"[\\[(*?)\\]]"または"\\[|\\]"または"[\\[+\\]]"String.split()の副作用、または正規表現の間違い?

しかし、メソッドは常に配列["", "01.02.2016","","0"]を返しました。 String.split(regexp)の通常の結果ですか、私の正規表現の誤りですか?

+8

'のstring.Split(正規表現)' *分割が*区切り文字*に基づいて、文字列を* APIで見て、それが*解析しません*文字列文字列 – TheLostMind

+1

と一致するグループを取得するには 'Pattern'と' Matcher'を使用してください。実際には動作が期待されています。 – TheLostMind

答えて

1

TheLostMindで提案されています。可能な解決策PatternMatcherを使用することが考えられます。

String s = "[01.02.2016][0][]"; 
Pattern p = Pattern.compile("(\\[[^\\]]*\\])"); 
Matcher m = p.matcher(s); 
while (m.find()) { 
    System.out.println("part = " + m.group()); 
} 

出力

part = [01.02.2016] 
part = [0] 
part = [] 

編集Kuzekoで述べたように。周囲のブラケットなしで部品を入手したい場合は、[]を次のように修正してください。

String s = "[01.02.2016][0][]"; 
Pattern p = Pattern.compile("\\[([^\\]]*)\\]"); // pattern changed 
Matcher m = p.matcher(s); 
while (m.find()) { 
    System.out.println("part = " + m.group(1)); // accessed group changed 
} 

出力

part = 01.02.2016 
part = 0 
part = 

あなたの質問の後半部分には、[編集]String.splitが働くように働いていました。使用 -

[\\[(*?)\\]]次の例を参照してください - 彼らは[...]

String s = "1[2(3*4?5)6]7"; 
System.out.println(Arrays.toString(s.split("[\\[(*?)\\]]"))); 
// output 
[1, 2, 3, 4, 5, 6, 7] 

\\[|\\]内でグループ化されているので([(*?]の任意の文字delimitterとして使用 -

String s = "1[2]3"; 
System.out.println(Arrays.toString(s.split("\\[|\\]"))); 
// output 
[1, 2, 3] 

[\\[+\\]][ delimitterまたは]として使用区切り文字のいずれかの文字が(内にグループ化されているため) 210

String s = "1[2[3+4]5"; 
System.out.println(Arrays.toString(s.split("[\\[+\\]]"))); 
// output 
[1, 2, 3, 4, 5] 

結果スレッシュホールドを指定しない場合は、空のフィールドを除外します。これは具体的にどのように機能するか説明については

String s = ",1,2,,,"; 
System.out.println(Arrays.toString(s.split(","))); 
// output 
[, 1, 2] 
System.out.println(Arrays.toString(s.split(",", 5))); 
// output 
[, 1, 2, , ,] 

String.split(s,int)

+0

かっこの空のペアを見つけたくない場合は、 '*'を '+'に置き換えることができます。 – biziclop

+0

''() ''を使用して、括弧の中の文字だけをグループ化し、OPの必要性を返す必要があります。 – Kuzeko

+0

Thnks、私はPatternとMatcherを使いますが、String.split()のその結果を知りたい。 –

-3

は、[問題解決]

String name ="[01.02.2016][0][]"; 
     name=name.replaceAll("[^\\d.]", " ").trim(); 
     String[] x1=name.split("[^\\d.]"); 
     System.out.println("name = "+x1[0]); 
     System.out.println("name = "+x1[2]); 

出力

name = 01.02.2016 
name = 0 
+2

devateersは不要です。 –

+2

あなたの解決策ははるかに最適ではありません。まず、「数字」またはピリオドのいずれにも一致しないものはすべてスペースで置き換えます。基本的に、 ']'と '['文字をスペースで置き換えています。その後、文字列の最初と最後から空白を削除してトリムします。 次に、 'digits'やピリオドと一致しない文字列を分割する別のregexpパスを作成します。基本的に、スペース文字を分割しているので、x1 [1]は空の文字列です。 regexpsのより良い理解を示す上記の解決策を見てください。 – Buurman

0

に応じて、あなたのパターンと分割の一致を検索するにはString.split試行これを試してみてください。 使用例として、カンマとセミコロンに基づいて文字列を分割したいとします。 その場合、 "正規表現" ,|;として使用します。

たとえば、"\\[|\\]"を使用すると、開いているかっこまたは閉じたものが見つかったときに分割されることを意味します。 したがって、最初のカッコの前に空白、同じカレンダーの前と後ろのカレンダーの日付、閉じたカレンダーと開いたカレンダーの間の空白などがあります。

@TheLostMindは、PatternMatcherとグループを代わりに使用したいと考えています。

関連する問題