2016-11-06 5 views
1
abc([^\r\n]*) // 0 or more 

abc([^\r\n]+)? // 1 or more, but it's optional 

Javaの場合。彼らはまったく同じように見えます。これらの2つの正規表現の違いはありますか?

+1

彼らは私にとっても同じように見えます。 –

+1

'abc'の場合、最初のキャプチャグループに空の文字列を保存し、2番目のグループはこのグループを保存しませんが、グループにアクセスしようとすると1.条件マッチング(PCRE、Boost、.netなど)や置換(Boost)がサポートされている他の正規表現のフレーバでは、これが大きな違いになることに注意してください。ああ、Delphiでは、名前の一致しないキャプチャグループにアクセスする際に問題があります。 –

+0

うわー。私はちょうどそれをテストしなければなりません、そして、私は間違った答えを投稿したと思います。 https://regex101.com/r/H6nkxD/1は、異なるパーサーがグループ '' '(...)に関して実際に異なった振る舞いをすることを示していますか?' ' – Art

答えて

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です。

関連する問題