2011-08-04 18 views
21

アイテムは、1つ以上の数字または文字の文字列のコンマで区切られたリストです。Java正規表現:キャプチャグループの繰り返し

Javaの0個以上の項目の括弧で囲まれたリストと一致させようとしています。

"" 
"(12)" 
"(abc,12)" 
"(abc,12),(30,asdf)" 
"(qqq,pp),(abc,12),(30,asdf,2)," 
私は次のように一致し、次の(間違った)パターン

\((.+?)\)(?:,\((.+?)\))* 

を作ってみた

qqq,pp 
abc,12 
30,asdf,2 

最後例えば、それぞれ以下のマッチンググループを返す必要があります

最後の例の場合

qqq,pp 
30,asdf,2 

ヒント?ありがとう

+2

")、("で文字列を分割して残りの括弧を削除して結果を得ることができますか? – Jens

+0

確実に['Matcher.find()'](http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#find())が必要です。 – Qix

答えて

33

そうです。 Javaの正規表現では、「可変」の数のキャプチャグループを持つことはできません。各グループは、そのグループの最後の試合の内容が含まれています

\((.+?)\)(?:,\((.+?)\))* 
    |___|  |___| 
group 1  group 2 

:あなたのパターンは2つのグループを持っています。つまり、abc,1230,asdf,2によって上書きされます。

関連質問:

ソリューションは一つの式(\((.+?)\)のようなもの)を使用し、試合を反復するmatcher.findを使用することです。

+0

ああ、おかげで私はそれを知らなかったので、今私は別のものを考えなければならない –

+0

うん。確かに迷惑です。 .netには(私がリンクしている質問/答えに見られるような)機能があります。 – aioobe

+5

@David、あなたがそれを見逃した場合、彼はすでにあなたに良い選択肢を与えました:) – Svish

2

ループ内で([^,]+)のような正規表現を使用するか、またはstr.split(",")を使用してすべての要素を一度に取得できます。このバージョン:str.split("\\s*,\\s*")でもスペースが許されています。

0

これが解決策になることがあります。

package com.drl.fw.sch; 

import java.util.regex.Pattern; 

public class AngularJSMatcher extends SimpleStringMatcher { 

Matcher delegate; 


public AngularJSMatcher(String lookFor){ 
    super(lookFor); 
    // ng-repeat 
    int ind = lookFor.indexOf('-'); 
    if(ind >= 0){ 
     StringBuilder sb = new StringBuilder(); 
     boolean first = true; 
     for (String s : lookFor.split("-")){ 
      if(first){ 
       sb.append(s); 
       first = false; 
      }else{ 
       if(s.length() >1){ 
        sb.append(s.substring(0,1).toUpperCase()); 
        sb.append(s.substring(1)); 

       }else{ 
        sb.append(s.toUpperCase()); 
       } 
      } 
     } 
     delegate = new SimpleStringMatcher(sb.toString()); 
    }else { 
     String words[] = lookFor.split("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])"); 
     if(words.length > 1){ 
      StringBuilder sb = new StringBuilder(); 
      for (int i=0;i < words.length;i++) { 
       sb.append(words[i].toLowerCase()); 
       if(i < words.length-1) sb.append("-"); 
      } 
      delegate = new SimpleStringMatcher(sb.toString()); 
     } 

    } 

} 

@Override 
public boolean match(String in) { 
    if(super.match(in)) return true; 
    if(delegate != null && delegate.match(in)) return true; 

    return false; 
} 

public static void main(String[] args){ 
    String lookfor="ngRepeatStart"; 

    Matcher matcher = new AngularJSMatcher(lookfor); 

    System.out.println(matcher.match("<header ng-repeat-start=\"item in items\">")); 
    System.out.println(matcher.match("var ngRepeatStart=\"item in items\">")); 

} 

}

1

(^ | \ + S)(\ S *)(($ | \ S +)\ 2)+ケースオプション/ Iを無視して

は、彼女は今

例ここでは左サイドを左 - https://regex101.com/r/FEmXui/2

Match 1 
Full match 3-23 ` left LEft leFT LEFT` 
Group 1. 3-4 ` ` 
Group 2. 4-8 `left` 
Group 3. 18-23 ` LEFT` 
Group 4. 18-19 ` ` 
関連する問題