2016-04-04 5 views
0

welches Muster sollte ich in regex verwenden, wenn ich das erste Muster zusammenbringen möchte, aber dann möchte ich das zweite Muster unmatched.regex wie man multiple Muster anpasst

zum Beispiel möchte ich die Zeichenfolge ‚id‘ von dezimal so lange gefolgt passen wie die Dezimalzahl nicht 6 oder 9.

ist so sollte es id1,id2,id3 ... usw. entsprechen aber nicht id6 und id9.

habe ich versucht, dieses Muster und es funktioniert nicht:

"id(\d|(?!6|9))" 
+0

Sie alle Zahlen in eine Zeichen-Klasse schreiben verwenden, außer '6' und '9' . Etwas wie das: ['/id[12345780]/gm'](https://regex101.com/r/uI8uZ7/2) – Shafizadeh

+0

Ist dies (' id1'..'id9') ein gutes Beispiel für das, was Sie eigentlich tun wollen oder haben Sie Ihr Problem zu stark vereinfacht? Ich frage nur, weil so eine kleine Auswahl möglicher Dinge nicht nach einer realen Situation klingt. –

+0

Bitte klären Sie, ob auf 'id' mehrere Ziffern folgen oder nicht? –

Antwort

3

Sie negative lookahead wie diese verwenden können.

Regex:\bid(?![69])\d\b

Erläuterung:

  • \b sorgt für die Wortgrenze.

  • (?![69]) negative Vorschau sorgt dafür, dass Zahl nicht 6 oder 9.

  • \d eine Ziffer nach id übereinstimmt.

Regex101 Demo

+0

Sie müssen in Ihrem Muster '+' nach '\ d' schreiben, um' id89' zu finden. – Shafizadeh

+0

@Shafizadeh: Das würde meiner Antwort entsprechen. –

+0

@ WiktorStribiżew Ja, Sie haben Recht .. +1 – Shafizadeh

1

Das id(\d|(?!6|9)) Muster entspricht id gefolgt mit einer beliebigen 1 Stelle oder, wenn es keine 6 oder 9 ist. Das Alternation (\d oder (?!6|9)) ermöglicht id6 und id9, weil die erste Alternative in NFA Regex "gewinnt" (d. H. Die weiteren Alternativen nach einem Treffer werden nicht getestet).

Wenn Sie nur id Matches mit 6 oder 9 Verwendung

\bid(?![69]\b)\d+\b 

ausschließen müssen Siehe regex demo

Wenn Sie alle id mit 6 und 9 passend vermeiden möchten folgenden es, verwenden

\bid(?![69])\d+ 

Siehe another regex demo.

Hier \d+ Streichhölzer eine oder mehr Ziffern, \b für eine Wortgrenze steht (die Ziffern vorangestellt werden sollen und anschließend mit Nicht- „Wort“ Zeichen), und der (?![69]) Look-Ahead nicht das Spiel, wenn es 6 ist oder nach id (mit oder ohne eine Wortgrenzenprüfung - je nachdem, was Sie brauchen).

UPDATE

Wenn Sie die id deren Zahl ausschließen müssen nicht startet mit 6 oder 9, können Sie

\bid[0-578]\d* 

(demo)

auf Shafizadeh's Kommentar basiert.

+0

Übrigens * negative Lookahead * ist in diesem Fall in Ordnung, aber ich denke, mit einer * Zeichenklasse * wäre viel schneller als * Lookahead *. https://regex101.com/r/lI6oS8/3 – Shafizadeh

+0

@Shafizadeh: Dieser Ansatz kann nicht verwendet werden, um zu überprüfen, ob die Zahl nicht gleich "6" oder "9" ist. Es kann nur verwendet werden, wenn Sie überprüfen möchten, ob die Nummer * nicht mit * 6 oder 9 beginnt. –

+0

Ich sehe ........! – Shafizadeh

3

Es ist nicht die beste Lösung, aber Sie können auch diese positive look ahead als

\bid(?=\d)(?:\d\d+|[^69])\b 

Regex Pannen

\b #word boundary 
    id #Match id literally 
    (?=\d) #Find if the next position contains digit (otherwise fails) 
    (?: #Non capturing group 
    \d\d+ #If there are more than one digits then match is success 
     | #OR (alternation) 
    [^69] #If its single digit don't match 6 or 9 
) #End of non capturing group 
\b 
mit tun

Regex Demo

Wenn Sie id überprüfen wollen, nicht gefolgt von 6 oder 9 und Sie wollen Fällen wie id16 akzeptieren, aber nicht id61, dann können Sie

\bid(?=\d)[^69]\d*\b 

Regex Demo

+0

Ihr Muster entspricht "id69", wobei "id" mit "6" beginnt. – Shafizadeh

+0

@Shafizadeh das OP nicht erwähnt, dass es nichts mit '6' oder' 9' passen sollte – rock321987

+1

Nicht enthalten ... folgend. Ich denke, OP will "id16", aber nicht "id61" passen – Shafizadeh