3または4回の区切りの前の文字に一致する正規表現キャプチャグループの書き方?

酒:

私は、区切り文字に応じて外の要素を分割正規表現を記述しようとしています。正規表現はまた、理想的には4があることを確認する必要があるが、少なくとも3つのコロン:それぞれ一致します。

ここでは例として文字列です:

"Checkers, etc:Blue::C, Backgammon, I say:Green::Pepsi:P, Chess, misc:White:Coke:Florida:A, :::U"

このことから、4つの試合があるはずです。

  • Checkers, etc:Blue::C
  • Backgammon, I say:Green::Pepsi:P
  • Chess, misc:White:Coke:Florida:A
  • :::U

ここで私はこれまで試したものです:

([^:]*:[^:]*){3,4}(?:, )

:で正規表現101 https://regex101.com/r/O8iacP/8

私はのために非キャプチャグループを設定してみました ,

それから私はありません任意の文字のグループのマッチングを試みた::とはありません任意の文字:3または4回。

私はこれらのグループを反復処理するために使用しているコードは次のとおりです。

String line = "Checkers, etc:Blue::C, Backgammon, I say::Pepsi:P, Chess:White:Coke:Florida:A, :::U";
String pattern = "([^:]*:[^:]*){3,4}(?:, )";

  // Create a Pattern object
  Pattern r = Pattern.compile(pattern);

  // Now create matcher object.
  Matcher matcher = r.matcher(line);
  while (matcher.find()) {
        System.out.println(matcher.group(1));
    }

すべてのヘルプは大歓迎です!

編集します

カシミールの正規表現@使用して、それが働いています。私はこのような使用のグループ(0)に上記のコードを変更する必要がありました:

String line = "Checkers, etc:Blue::C, Backgammon, I say::Pepsi:P, Chess:White:Coke:Florida:A, :::U";
String pattern = "(?![\\s,])(?:[^:]*:){3}\\S*(?![^,])";

// Create a Pattern object
Pattern r = Pattern.compile(pattern);

// Now create matcher object.
Matcher matcher = r.matcher(line);
while (matcher.find()) {
    System.out.println(matcher.group(0));
}

今すぐ印刷します。

Checkers, etc:Blue::C
Backgammon, I say::Pepsi:P
Chess:White:Coke:Florida:A
:::U

再度、感謝します!

カシミールとイポリット:

私はこのパターンをお勧め:

(?![\\s,])(?:[^:]*:){3}\\S*(?![^,])

負の先読みは、先頭または末尾に区切り文字を一致させることは避けてください。特定の力区切り文字または文字列(の端部が追従すべき試合で二番目のコンマではない文字が続いていません)。

デモ

パターンが捕獲基を有していないので、結果は、全体の一致(またはグループ0)であることに留意されたいです。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=312741&siteId=1