Ich wurde gebeten, die Menge der Wörter zu finden, die mit einer Teilzeichenfolge der Länge 3 beginnen, die die Zeichen a, b und c enthält und zusätzlich eine weitere disjunkte Teilzeichenfolge mit denselben 3 Zeichen enthält.
Beispiel: abcacb acbbac
hilf mir, einen regulären Ausdruck dafür zu finden. Danke
Bearbeiten: abcbac – a, b, c sollten die ersten drei Buchstaben sein, dann sollten a, b, c ihre Reihenfolge gegenüber den vorherigen drei Buchstaben ändern. Nur 6 Zeichenfolgen.
acbbca abccba bacbca usw....
Antwort1
(Lösungen setzen hier GNU voraus, grep
wenn sie mit PCRE-Unterstützung erstellt werden (wie es normalerweise bei Cygwin der Fall ist)).
Die erste Hälfte Ihrer Anforderungen würde bedeuten.
grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*(?1)\w*'
Oder möglicherweise:
grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*\1\w*'
Für die zweite Hälfte scheint das im Widerspruch zur ersten Hälfte zu stehen:
grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!\1)(?1)'
Finde dieWörter(Wortdefiniert als eine Zeichenfolge in diesem Fall), die mit einer Folge von 3 Zeichen beginnt , [a-zA-Z0-9_]
die aus und besteht (jeweils einem), gefolgt von einer weiteren dieser Folgen ( die sich auf denselben regulären Ausdruck wie in der ersten Gruppe bezieht), vorausgesetzt, sie ist nicht identisch mit der ersten ( bezieht sich auf die Zeichenfolge, die von der ersten Erfassungsgruppe gefunden wurde und ist einea
b
c
(?1)
(...)
\1
(...)
(?!...)
negativer Blick nach vornOperator).
$ echo abcbca abcbcax abcabc aaabbb xcabacb abcacb-blah |
grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!\1)(?1)'
abcbca
abcacb
Antwort2
Das hier sollte genügen:
grep -Ew '[a-c]{3}.*[a-c]{3}'
-E
um reguläre Ausdrücke abzugleichen-w
um nur Wörter abzugleichen[a-c]{3}
wird genau 3 Zeichen aus dema-c
Satz entsprechen.*
passt zu allem zwischen