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

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

In Java. Sie sehen für mich genauso aus.Irgendein Unterschied zwischen diesen beiden regulären Ausdruck?

+1

Sie sehen auch gleich aus. –

+1

Im Falle von 'abc' speichert der erste eine leere Zeichenfolge in der ersten Erfassungsgruppe, der zweite wird diese Gruppe nicht speichern, aber ich bin nicht vertraut genug mit Java, um zu wissen, was passiert, wenn Sie versuchen, auf Gruppe zuzugreifen 1. Beachten Sie, dass in anderen Regex-Varianten, wo bedingte Übereinstimmung (PCRE, Boost, .net usw.) oder Ersetzen (Boost) unterstützt wird, dies einen großen Unterschied machen kann. Oh und Delphi hat Probleme beim Zugriff auf nicht gematchte benannte einfangende Gruppen. –

+0

Wow. Ich musste es nur testen und ich schätze, ich habe die falsche Antwort gepostet. https://regex101.com/r/H6nkxD/1 zeigt, dass sich verschiedene Parser tatsächlich in Bezug auf die Gruppe '' '(...)?' '' anders verhalten – Art

Antwort

2

Es gibt einen kleinen Unterschied zwischen den beiden. Die folgenden 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."); 
     } 
    } 
} 

Ausgang gibt:

MatchCount: 1 
Group 1: 
MatchCount: 1 
Group 1: null 

also im Fall der Zeichenfolge abc die erste regex eine Erfassungsgruppe mit leeren Inhalt erzeugt, während in den zweiten die Gruppe leer ist, und daher nicht aufeinander abgestimmt. Obwohl ich mit Java nicht so vertraut bin, würde ich annehmen, dass Sie sie ein wenig anders behandeln müssen.

Nebenbei bemerkt:

Java nicht bedingte Anpassung unterstützen (im Gegensatz zu PCRE, .net, Steiger und einige mehr) und bedingte ersetzen (im Gegensatz zu Boost), wo dies einen großen Unterschied machen würde. Oh und Delphi hat issues with optional named capturing groups.

Verwandte Themen