1

私はこの正規表現を書きました:

\\s+(?:([^:]+):)(?:([^:]+):)(?:([^:]+):)(?:([^:]+):)

そのようなものを解析するには:

lvt:vgt:mwi-ao:44.00m :::: lvt_mlog:100.00:lvt2:vgt2:-wi-a-:908.00m ::::::

1グループは次のようになります:lvt 2グループ:vgt ... 4グループ:44.00m

短くしたいです。

私はそのような方法でそれをやろうとします:\\s+(?:([^:]+):)+

ただし、この場合は最後のグループのみをキャッチします。

結果は次のようになります:1グループ:44.00m

4

4 に答える 4

1

削除できる不要な非キャプチャ括弧がたくさんあります。

\\s+([^:]+):([^:]+):([^:]+):([^:]+):
于 2012-07-24T08:55:44.580 に答える
0

':'の間の値を探している場合は、String.split(regex)を使用できます。

String[] result = 
   "lvt:vgt:mwi-ao:44.00m::::lvt_mlog:100.00: lvt2:vgt2:-wi-a-:908.00m::::::".split(":");

それがあなたにとって便利であるならば、それはグループ正規表現より速いでしょう...そしてそれはあなたが見つけることができるより短い正規表現です

誤った注釈の編集が抑制されました
グループの追加

通常の場合、グループは次のように見つかります' ::::':

for(int i = 0, n = result.length; i < n; i+= 6) {
    final String group1 = result[i];
    final String group2  =result[i+1];
    ...
}

whileそれ以外の場合は、最後の空のフィールドの後にgroup1を使用して再起動します。

于 2012-07-24T09:07:03.787 に答える
0
import java.util.regex.Pattern;
import java.util.regex.Matcher;

class RegexTest{
    public static void main(String[] args){
        Pattern pat= Pattern.compile("\\s(([^:]+):){3}([^:]+)");
        Matcher mat= pat.matcher(" lvt:vgt:mwi-ao:44.00m::::lvt_mlog:100.00: lvt2:vgt2:-wi-a-:908.00m::::::");
        while(mat.find()){
            System.console().format("group: %s , start: %d , end: %d\\n",
            mat.group(), mat.start(), mat.end());
        }
    }
}

グループ:lvt:vgt:mwi-ao:44.00m、開始:0、終了:22

グループ:lvt2:vgt2:-wi-a-:908.00m、開始:42、終了:67

次に、グループを「:」で分割できます。

于 2012-07-24T10:17:55.710 に答える
0

Javaでは、複数の一致を1つのグループにまとめることはできません。つまり、一度に1つのグループ(?:([^:]+):)+に収集するなどを使用するlvtことはできませんvgt

あなたができることは、テキストを個々の行に分割することです。常に4つのグループがあることがわかっている場合は、次のような式を使用して、呼び出しfind()てからgroup(0)4回続けて呼び出します[^:]+lvtこれは、、、および4回の呼び出しをキャッチする必要vgtがあります。mwi-ao44.00m

一部の擬似コード(テストされていないため、タイプミスが含まれている可能性があります:)):

Pattern p = Pattern.compile("[^:]+");

String input = ...;
String[] lines = input.split("\\s");

for( String line : lines ) {
  //note that for simple cases like above you could also just split by ":"

  Matcher m = p.matcher(line);
  List<String> elements = new LinkedList<String>();
  while( m.find() ) {
    elements.add( m.group(0) );
  }

  //get the first 4 elements from the list
  //if there are less then 4 in the list, the line didn't match
}

編集:空白とフィールドをコロン()で区切るように見える編集済みの質問に一致するように回答を更新しました:

于 2012-07-24T08:43:43.873 に答える