正規表現-一対の記号の内容を一致させる方法

4581 ワード

要約:引用符「」を例に、正規一致の使用方法を説明します.
例1:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {

    public static void main(String[] args) {
        String regEx = "\"(.+)\"";
        String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(source);

        while (matcher.find()) {
            String result = matcher.group(0);
            System.out.println(result);
        }
    }
}

結果を返します.
"McDon ald's" is said "markudonarudo"

例2:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {

    public static void main(String[] args) {
        String regEx = "\"([^\"]+)\"";
        String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(source);

        while (matcher.find()) {
            String result = matcher.group(0);
            System.out.println(result);
        }
    }
}

結果を返します.
"McDon ald's"
"markudonarudo"

実は私が望んでいる結果は2つ目で、違いは2つ目で、私は排除型文字グループを使っています.
[^],1つ目は
.+.では次に
.+ 分析します.
なぜなら任意の文字にマッチすることができ、[^"]は非引用符(")以外の任意の文字にしかマッチできず、正則的な貪欲性を加えると、最後まで後ろにマッチし、また終了符は引用符(")であるため、一致する最後は条件を満たさず、引用符(")に一致するまで前の文字の1文字の移動が行われるので、例1の結果が得られる.
では、欲張らずに例2の効果を達成するには、例3を見てみましょう.
例3:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {

    public static void main(String[] args) {
        String regEx = "\"(.+?)\"";
        String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(source);

        while (matcher.find()) {
            String result = matcher.group(0);
            System.out.println(result);
        }
    }
}

結果を返します.
"McDon ald's"
"markudonarudo"

今では例3と例2の結果が同じように見えます.今回は怠惰モードを使いましたが、使いました?、貪欲モードを怠惰モードに変えると、その名の通り、受け入れられると終わり、貪欲モードを最初のマッチング位置からの逆マッチングと理解することができ、怠惰モードは最初のマッチング位置からの順マッチングと理解することができ、マッチングできる末尾引用符(")を見つけて終わります.
シナリオ:
.+?           ,       ,         ,    ,.+?           ,     ,        ?    :“       ,    ?”,  ,.+    ,     ,   “          ,           。

例4:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {

    public static void main(String[] args) {
        String regEx = "(?<=\")(.+?)(?=\")";
        String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(source);

        while (matcher.find()) {
            String result = matcher.group(0);
            System.out.println(result);
        }
    }
}

結果を返します.
McDon ald's
 is said 
markudonarudo

この場合,ループビューが出現し,2つの1番の間が一致したので,今回はこの正規表現を解析する.
1. ?単独で使うのが一番マッチしていて、合わなくてもいいメタ文字なので、怠惰な使い方は貪欲なメタ文字の後ろに続くはずです
2.(?<=")は、この位置の左側に「1つ」が必要であり、正則的に占有されない以上、「右側が何であるか」は管理されないので、何でもない隙間位置を占有していると考えることができ、この隙間位置は1つの要求が左である」だけである.
3.(?=")は、2文字の間の隙間の位置を占めることを意味し、隙間の位置の右側は"です.
見回しても文字を占有しないため、隙間は理解するだけで、本当の隙間は存在しない.このようにマッチングが終わった位置はsと「間の位置に達するだけで、次のマッチングの時には」もマッチングされる.
例5:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {

    public static void main(String[] args) {
        String regEx = "\"((?!\").)+\"";
        String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(source);

        while (matcher.find()) {
            String result = matcher.group(0);
            System.out.println(result);
        }
    }
}

実行結果:
"McDon ald's"
"markudonarudo"

例4は見回し、
例5は環視を排除する.
1.(?!").の意味は1つの位置の右侧が"ではありませんて、それから后ろに1つつなぎました.ああ、そうですか.他の文字でもいいですが、できません」.
原文リンク:正規表現---英語の二重引用符の内容を取得