1
abc([^\r\n]*) // 0 or more
abc([^\r\n]+)? // 1 or more, but it's optional
Javaの場合。彼らはまったく同じように見えます。これらの2つの正規表現の違いはありますか?
abc([^\r\n]*) // 0 or more
abc([^\r\n]+)? // 1 or more, but it's optional
Javaの場合。彼らはまったく同じように見えます。これらの2つの正規表現の違いはありますか?
この2つの間には小さな違いがあります。以下code
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Example
{
public static void main (String[] args)
{
String text = "abc";
Pattern p1 = Pattern.compile("abc([^\\r\\n]*)");
Matcher m1 = p1.matcher(text);
if (m1.find()) {
System.out.println("MatchCount: " + m1.groupCount());
System.out.println("Group 1: " + m1.group(1));
} else {
System.out.println("No match.");
}
Pattern p2 = Pattern.compile("abc([^\\r\\n]+)?");
Matcher m2 = p2.matcher(text);
if (m2.find()) {
System.out.println("MatchCount: " + m2.groupCount());
System.out.println("Group 1: " + m2.group(1));
} else {
System.out.println("No match.");
}
}
}
出力を与える:第二のグループが空で、従って一致しないながら
MatchCount: 1
Group 1:
MatchCount: 1
Group 1: null
そこでストリングabc
の場合、第1の正規表現は、空のコンテンツとのキャプチャグループを作成します。私はJavaに精通していませんが、私はあなたがそれらを少しずつ扱わなければならないと思います。
追記:
Javaは、これは大きな違いを生むだろう、条件マッチング(PCREとは異なり、.NET、ブーストおよびいくつかのより多くの)及び(ブーストとは異なり)の交換条件をサポートしていません。ああ、デルファイはissues with optional named capturing groupsです。
彼らは私にとっても同じように見えます。 –
'abc'の場合、最初のキャプチャグループに空の文字列を保存し、2番目のグループはこのグループを保存しませんが、グループにアクセスしようとすると1.条件マッチング(PCRE、Boost、.netなど)や置換(Boost)がサポートされている他の正規表現のフレーバでは、これが大きな違いになることに注意してください。ああ、Delphiでは、名前の一致しないキャプチャグループにアクセスする際に問題があります。 –
うわー。私はちょうどそれをテストしなければなりません、そして、私は間違った答えを投稿したと思います。 https://regex101.com/r/H6nkxD/1は、異なるパーサーがグループ '' '(...)に関して実際に異なった振る舞いをすることを示していますか?' ' – Art