2016-08-07 24 views
2

Ich möchte eine dreiteilige Zeichenfolge übereinstimmen. Der erste Teil besteht aus einem oder mehreren a Zeichen, der zweite Teil besteht aus einem oder mehreren b Zeichen, und der dritte Teil besteht entweder aus null oder mehr c Zeichen oder null oder mehr C Zeichen, aber kein Mix aus c und .Javascript gierige Regex erscheint nicht-gierig

Als solches Ich schrieb den folgenden regulären Ausdruck:

/a+b+(C*|c*)/ 

und bemerkte sofort, dass sie die Hinter c s in der folgenden Zeichenfolge Gierig nicht übereinstimmt:

aaaaabbcc 

Umwickeln der inneren Klauseln von der Klausel oder behebt das unerwartete Verhalten nicht:

/a+b+((C*)|(c*))/ 

Aber interessant sowohl reguläre Ausdrücke passen die folgenden, wobei die C Zeichen die erste Klausel des Spiels oder:

aaaaabbCC 

Der folgende reguläre Ausdruck die Semantik genau erfasst, aber ich möchte, warum die ursprüngliche regulären Ausdruck verstehen verhält sich unerwartet.

/a+b+(([Cc])\2*)?/ 
+0

Meinst du, es funktioniert nicht, weil das 'c' nicht übereinstimmt? Aber 'C *' tat, deshalb wurde 'c *' nicht einmal getestet. –

+0

Ah, ja - ich sollte das klarstellen – skeggse

Antwort

5

Ihre Regex funktioniert nicht, weil zuerst versucht es C*, die die leere Zeichenfolge übereinstimmt, so hat sie die oder Klausel erfüllt. Dann wird nicht versucht zu überprüfen, ob c* mehr Zeichen entsprechen kann.

Hier ist ein regulärer Ausdruck, der die Zeichenfolge überein, wie beabsichtigt:

/a+b+(C+|c+)?/ 

Das heißt, wenn es ein C findet, wird es so viele mehr C wie möglich entsprechen, wenn es ein c findet es passen wird als viel mehr c wie möglich. Aber das Finden C oder c ist optional.

2

Sie müssen das * außerhalb der Halterung platzieren!

+0

Nein, das würde 'aaaaabbcCcCc' entsprechen, was ich nicht will. – skeggse

1

var input = "aaaaabbc"; 
 

 
// if you want to pick up c 
 
console.log(/a+b+(c|C)*/.exec(input).pop());

+0

Nein, das würde 'aaaaabbcCcCc' entsprechen, was ich nicht will. – skeggse

+2

Was erwarten Sie? Stellen Sie weitere Informationen zur Verfügung ... – Hitmands

+0

Ja, mir wurde klar, dass es ein wenig im Detail fehlt. Der Punkt ist, dass die Regex die zwei Klauseln der Klausel oder inkonsistent zu behandeln scheint. – skeggse