2016-07-19 21 views
0

Ich konvertiere eine Excel-Datei in eine CSV, und das zu einem String.Regulärer Ausdruck in Java funktioniert nicht

Das Problem ist, dass ein regulärer Ausdruck nicht richtig funktioniert

Ich mag diese Art von Text erkennen:

MYW Pkg, MYW Pkg + Quick-Service-Restaurants, MYW Pkg + Restaurants, MYW Pkg + Deluxe Restaurants,

Room + Tickets + Quick Service Gastronomie

ich habe ein Array o f Zeichenfolge. Also muss ich dafür ein Muster wissen, ich versuche, dies aber es ist es nicht erkennen:

Pattern.compile("([A-Z]{3})+(\\s)+([A-Za-z]{3})+(\\s)+(\\+)"); 

Ich versuche, „+ MYW Pkg“ entsprechen zum Beispiel Wissen Sie, warum es nicht funktioniert ?

mehr Code:

Kette ist das Array mit den Werten wie "MYW Pkg"

Pattern patPackageDescription = Pattern.compile("([A-Z]{3})+(\\s)+([A-Za-z])+(\\s)+(\\+)"); 
     for (int i = 0; i < chain.length; i++) { 
      Matcher matPackageDescription = patPackageDescription 
        .matcher(chain[i]); 

      if (matPackageDescription.matches()) { 
       String space = String.format("%1$-" + 50 + "s", 
         chain[i].toString()); 
       a.append(space + "|\n"); 
      } 
     } 

Grüßen.

+1

Welche Teile der obigen Zeichenfolge Sie zu entsprechen versuchen. Zwei Dinge, die ich hervorheben werde, sind 1) '(?)' Ist seltsam/höchstwahrscheinlich nicht notwendig und 2) du suchst nach '[AZ] +' direkt vor '\\ +' (obwohl zwischen ' Pkg' und '+'). – Sam

+0

@Sam Ich versuche, mindestens "MYW Pkg +" zu entsprechen, und Anubhava (?) Ist nicht für Groß-und Kleinschreibung empfindlich? – arnoldssss

+2

Inline case insensitive Modifier wird aussehen wie '(? I: [AZ])', aber Sie können einfach '[A-Za-z]' –

Antwort

2

matches() Methode versucht, die gesamte Zeichenfolge mit dem Muster übereinstimmen, um einen Teil der Zeichenfolge zu entsprechen, die Sie verwenden müssen find() Methode.

String str = "MYW Pkg, MYW Pkg + Quick Service Dining, MYW Pkg + Dining, MYW Pkg + Deluxe Dining,"; 
Pattern patPackageDescription = Pattern.compile("([A-Za-z]{3}\\s)+\\+"); 
Matcher matPackageDescription = patPackageDescription.matcher(str); 

while (matPackageDescription.find()) { 
    System.out.println(matPackageDescription.group()); 
} 

Ausgänge:

MYW Pkg + 
MYW Pkg + 
MYW Pkg + 

Blick here für eine Erklärung.

+0

Ist richtig, was Sie sagen, ich füge (. *) für eine korrekte Übereinstimmung .. Also ([A-Za-z] {n} \\ s) + (\\ +) + ([A-Za-z] {n} \\ s) + (\\ +) + (. *) Das sollte für diese Fälle dienen: MYW Pkg + Quick Service Essen, Zimmer + Tickets + Quick Service Dining ..... Richtig? – arnoldssss

+0

Wie kann ich n für eine beliebige Nummer? – arnoldssss

+0

@arnoldssss, sag mir, was genau du tun musst =) Also kann ich dir helfen. – spirit

1

Ihr Problem ist, dass Sie Matcher.matches() verwenden, die eine vollständige Übereinstimmung erfordert, entweder wenn Sie find() für teilweise Übereinstimmungen oder fügen Sie .* alles passen nach dem Suchbegriff verwenden können.

([A-Z]{3})+(\s)+([A-Za-z]{3})+(\s)+(\+).* 

Regular expression visualization

Debuggex Demo

+0

cool ich füge es hinzu .. so ([A-Za-z] {n} \\ s) + (\\ +) + ([A-Za-z] {n} \\ s) + (\\ + +) (*) , die für diese Fälle dienen sollten. MYW Pkg + Quick Service Gastronomie Und Room + Tickets + Quick Service Gastronomie Recht? – arnoldssss

+0

Wenn Ihre Zeichenfolge von etwas wie Nummer beginnt, wird es fehlschlagen. Sie müssen auch '. *?' an den Anfang Ihrer Regex hinzufügen – spirit

Verwandte Themen