2017-02-16 23 views
0

Ich habe eine Anforderung, in der der Ergebnisbildschirm den Namen in(), [] angezeigt. Zum Beispiel:Regulärer Ausdruck mit oder Bedingung

(son of X) (Smith),(son of X) Smith 
[Son of X] Smith 
[Son of X] [Smith] 

Ich möchte den ersten Namen in ihm abrufen. Ich versuchte, die unter regulären Ausdruck für die erste Saite, aber es hilft nicht:

 String name="(son of x) (Smith)"; 
     Matcher matcher = Pattern.compile("\\(.*\\)\\b").matcher(name); 
     while (matcher.find()) { 
       System.out.println(matcher.group()); 
     } 

Kann jemand Hilfe in den regulären Ausdruck bilden? Bitte lassen Sie sich auch eine oder eine Bedingung geben?

+1

Suche nach "entweder X oder Y" im [Javadoc] (https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html). –

+2

Was ist die genaue Ausgabe, die Sie wollen? – IfOnly

+0

Versuchen Sie ['"^[(\\ []. *? [) \\]] \\ W * (\\ w +) "'] (https://regex101.com/r/PrFogN/1) regex und Nimm den Wert in Gruppe 1 ('matcher.group (1)'). –

Antwort

0

Sie müssen sich mit ^ die Suche am Anfang des Strings zu verankern, dann entweder ( oder [, dann capture 0+ chars andere, bis zum ersten ) oder ] entsprechen.

Siehe Java demo:

//String s = "(son of X) (Smith),(son of X) Smith"; // son of X 
String s = "[Son of X] Smith"; // Son of X 
Pattern pattern = Pattern.compile("^[(\\[](.*?)[\\])]"); 
Matcher matcher = pattern.matcher(s); 
if (matcher.find()){ 
    System.out.println(matcher.group(1)); 
} 

Einzelheiten:

  • ^ - Beginn der Zeichenfolge
  • [(\\[] - eine [ oder (
  • (.*?) - Gruppe 1: any 0+ Zeichen andere als Linienbruchzeichen so wenige wie möglich bis zum ersten
  • [\\])] - a ) oder ].