2017-09-06 4 views
1

私はテキストのこの種類があります。Javaの正規表現キー:値を複数行

:33: 88アプリ2/8スーパーマンのタマン、Puchongの36100、マレーシア

:22: BLA BLA \ BLA /かくかくしかじか

:32: 45 // dsfd // qdsfqsdf

:72D:キー:値

この例では、フォームを有しています。値は1つまたは複数の行に指定できます。

私は正規表現(:[0-9] {2} [A-Z]?:)(。*)を試しましたが、マルチライン値の最初の行だけを取得しました。 Pattern.DOTALLオプションを試してみると、結果には最初のキーのすべてのテキストが含まれています。

正しいRegexは何ですか?

+0

使用[ '^([0-9] {2} [AZ]:?)(。*)'](https://regex101.com/r/QXKDfT/1 )を 'Pattern.MULTILINE'修飾子で置き換えます。 – anubhava

答えて

1

あなたは

(?m)^(:\d{2}[A-Z]?:)(.*(?:\r?\n(?!:\d{2}[A-Z]?:).*)*) 

が​​を参照してください使用することができます。 を使用しないでください。Pattern.DOTALLを使用してください。

詳細

  • (?m)^ - グループ1 - ライン
  • (:\d{2}[A-Z]?:)の開始と一致する:
    • : - コロン
    • \d{2}から2桁
    • [A-Z]?を - 1または0大文字のASCII文字
    • : - コロン
  • (.*(?:\r?\n(?!:\d{2}[A-Z]?:).*)*) - グループ2:
    • .* - ゼロ - 行(改行文字以外の0以上の文字)
    • (?:\r?\n(?!:\d{2}[A-Z]?:).*)*の残りの部分またはそれ以上のシーケンス:
      • \r?\n(?!:\d{2}[A-Z]?:) - 改行(Java 8では\r?\nである必要があります)グループ1
      • .*に使用されるようなパターンに従っていないこと)\Rに置き換え -
    • Javaでは

は、使用行の残り

String pat = "(?m)^(:\\d{2}[A-Z]?:)(.*(?:\r?\n(?!:\\d{2}[A-Z]?:).*)*)"; 

参照してください。 Java demo

String s = ":33: 88 app 2/8\nsuperman taman, puchong\n36100, Malaysia\n:22: bla bla \\bla /bla\nbla bla\n:32: 45//dsfd//qdsfqsdf\n:72D: Example"; 
Pattern pattern = Pattern.compile("(?m)^(:\\d{2}[A-Z]?:)(.*(?:\r?\n(?!:\\d{2}[A-Z]?:).*)*)"); 
Matcher matcher = pattern.matcher(s); 
while (matcher.find()){ 
    System.out.println("--- NEXT PAIR ---"); 
    System.out.println("Key:" + matcher.group(1)); 
    System.out.println("Value:" + matcher.group(2)); 
} 

出力:

--- NEXT PAIR --- 
Key::33: 
Value: 88 app 2/8 
superman taman, puchong 
36100, Malaysia 
--- NEXT PAIR --- 
Key::22: 
Value: bla bla \bla /bla 
bla bla 
--- NEXT PAIR --- 
Key::32: 
Value: 45//dsfd//qdsfqsdf 
--- NEXT PAIR --- 
Key::72D: 
Value: Example 
+0

すみません、ありがとうございます。完璧に動作します – Samy