Mehrere Wörter in beliebiger Reihenfolge mit Regex

Wie der Titel sagt, muss ich zwei spezifische Wörter in einem Satz finden. Aber sie können in jeder Reihenfolge und in jedem Gehäuse sein. Wie gehe ich mit Regex vor?

Zum Beispiel muss ich die Wörter test und long aus dem folgenden Satz extrahieren, ob das Wort test zuerst oder long kommt.

 This is a very long sentence used as a test 

UPDATE: Was ich im ersten Teil nicht erwähnt habe, ist, dass es auch die Groß- / Kleinschreibung beachten muss.

Solutions Collecting From Web of "Mehrere Wörter in beliebiger Reihenfolge mit Regex"

Verwenden Sie eine Erfassungsgruppe, wenn Sie die Treffer extrahieren möchten: (test) | (lang) Dann können Sie sich abhängig von der verwendeten Sprache auf die übereinstimmende Gruppe beziehen, zum Beispiel mit $ 1 und $ 2.

Sie können verwenden

 (?=.*test)(?=.*long) 

Quelle: MySQL SELECT LIKE oder REGEXP, um mehrere Wörter in einem Datensatz zu vergleichen

Ich nehme (immer gefährlich) an, dass Sie ganze Wörter finden wollen, also würde “Test” übereinstimmen, aber “Testy” würde nicht. Daher muss das Muster nach Wortgrenzen suchen, daher verwende ich das Wortgrenzenmuster “\ b”.

 /(?i)(\btest\b.*\blong\b|\blong\b.*\btest\b)/ 

ohne zu wissen, welche Sprache

  /test.*long/ 

oder

 /long.*test/ 

oder

 /test/ && /long/ 

Versuche dies:

 /(?i)(?:test.*long|long.*test)/ 

Das entspricht entweder test und dann long oder long und dann test . Es ignoriert Fallunterschiede.

Ich benutzte libpcre mit C, wo ich Callouts definieren konnte. Sie haben mir geholfen, nicht nur Wörter, sondern auch Unterausdrücke in beliebiger Reihenfolge zu finden. Die Regexp sieht folgendermaßen aus:

 (?C0)(expr1(?C1)|expr2(?C2)|...|exprn(?Cn)){n} 

und die Callout-function wacht darüber, dass jeder Teilausdruck genau einmal übereinstimmt, wie:

 int mycallout(pcre_callout_block *b){ static int subexpr[255]; if(b->callout_number == 0){ //callout (?C0) - clear all counts to 0 memset(&subexpr,'\0',sizeof(subexpr)); return 0; }else{ //if returns >0, match fails return subexpr[b->callout_number-1]++; } } 

So etwas sollte auch in Perl möglich sein.

Ich denke nicht, dass du es mit einer einzigen Regex machen kannst. Sie müssen logische UND von zwei – eins suchen für jedes Wort.