正規表現は複数行の例にマッチします - Java

正規表現は複数行の例に一致します– Java

デフォルトでは、「。」は改行と一致しません。 複数の行を一致させるには、プレフィックス(?s)を追加するか、Pattern.DOTALLフラグを有効にします。

1. 例

住所のサンプル。「住所1」のみを抽出する必要があります。

Starting...
Address 1: 88 app 2/8
    superman taman, puchong
    36100, Malaysia
Address 2: abc
End

Failed :
「アドレス1」を抽出するために、このパターンは何も返さず、「。」を返します。複数の行に一致しません。

Address 1:\\s(.*)Address 2:

Correct :
「アドレス1」を抽出するには、(?s)プレフィックスを追加します。

(?s)Address 1:\\s(.*)Address 2:

または、Pattern.DOTALLモードを有効にします。

Pattern.compile(Address 1:\\s(.*)Address 2:, Pattern.DOTALL);

2. 正規表現の例

「アドレス1」を取得するために正規表現の複数行一致を使用する例

package com.example.regex

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RunExampleTest{

    private Pattern addressPattern = Pattern.compile(ADDRESS_PATTERN);
    private Matcher matcher;

    //Alternative
    /*private Pattern addressPattern =
        Pattern.compile(ADDRESS_PATTERN, Pattern.DOTALL);*/

    private static final String ADDRESS_PATTERN = "(?s)Address 1:\\s(.*)Address 2:";

    public static void main(String[] args) {

        String data = "Testing... \n" +
            "Address 1: 88 app 2/8\n" +
            "superman taman, puchong\n" +
            "36100, Malaysia\n" +
            "Address 2: abc" +
            "testing end";

        RunExampleTest obj = new RunExampleTest();
        List list = obj.getAddress(data);

        System.out.println("Test Data : ");
        System.out.println(data + "\n");

        System.out.println("Address Resut : " + list);

    }

    private List getAddress(String data){

        List result = new ArrayList();

        matcher = addressPattern.matcher(data);

        while (matcher.find()) {
            result.add(matcher.group(1));
        }

        return result;
    }

}

出力

Test Data :
Testing...
Address 1: 88 app 2/8
superman taman, puchong
47100, Malaysia
Address 2: abctesting end

Result : [88 app 2/8
superman taman, puchong
47100, Malaysia
]