2017-10-23 1 views
-2

Ich versuche, eine Regex mit einer Zeichenfolge so lange wie möglich übereinstimmen. Dies ist die Zeichenfolge in aussehen:Verwenden Sie Regex, um nur sequenzielle (aber nicht unbedingt konsekutive) Übereinstimmungen zu finden

"xxaxxbxxbxbxxbxxbxxbxxdxx" 

Das Muster ist zum Spiel:

"bcda" 

Das Muster zu interpretieren ist wie folgt:

  • b: Es gibt mehrere von ihnen in der Zeichenfolge. Der erste sollte übereinstimmen.
  • c: Es gibt keinen in der Zeichenfolge, also wird nichts zurückgegeben.
  • d: Es ist nur eine am Ende der Zeichenfolge. Es sollte zurückgegeben werden.
  • a: Es ist eine am Anfang der Zeichenfolge. Da b, c und d zuerst gesucht wurden und Ergebnisse zurückgegeben werden, wird a nicht zurückgegeben.

Die erwartete Rendite ist:

"bd" 

Es dass Regex sein kann, ist nicht der richtige Weg, dies zu tun, aber ich würde gerne mit einem um Hilfe bitten. Die grundlegende Frage lautet: Kann ich regex verwenden, um generisch eine Teilzeichenkette zu finden, die so viel wie möglich einer geordneten, aber nicht notwendigerweise konsekutiven Folge von möglichen Zeichen darstellt? Wenn das so ist, wie?

+2

Was ist Ihre Frage? – sawa

+0

Hier ist ein Beispiel für eine Regex, die Sie verwenden können: http://rubular.com/r/tMw2SA0Rtt – jaytea

+0

OK, es sieht aus wie Sie Ihre Frage geändert .. Regex ist nicht mehr der Weg, um hier zu gehen. Ihre Anforderungen sind ein wenig willkürlich; Es gibt keine Erklärung dafür, warum wir "d" finden, sondern "a" aufgeben. Ich nehme an, weil wir einen Fehler ('c') gefunden haben? Jedenfalls wäre es nicht möglich, ein verallgemeinertes Muster einfach ohne irgendeine tatsächliche Programmierung in einen regulären Ausdruck zu überführen. – jaytea

Antwort

-1

Es ist unmöglich, dies mit einer einzigen Regex-Übereinstimmung zu tun. Ein Capture in einer Regex muss eine Teilzeichenfolge der ursprünglichen Zeichenfolge sein. bd hier ist nicht, so gibt es keine Möglichkeit, das als ein einzelnes Capture zu vergleichen.

+0

Also zur Klarheit, Sie meinen, dass xbxdx nicht die Teilzeichenfolge "bd" enthält, weil b und d nicht aufeinander folgen? – AuroraTertius

+0

Nein, '" bd "' ist ** nicht ** ein Teilstring von '" xbxdx "'. – sawa

+0

Dann ist bd ein Teilstring von "xxb dxx"? – AuroraTertius

1

Wie @sawa erklärt, können Sie dies nicht mit einer einzigen Regex tun. Hier ist eine rekursive Lösung.

def consecutive_matches(str, pattern) 
    return '' if str.empty? || pattern.empty? 
    ch, pat = pattern[0], pattern[1..-1] 
    i = str.index(ch) 
    if i 
    ch + consecutive_matches(str[i+1..-1], pat) 
    else    
    consecutive_matches(str, pat) 
    end 
end 

str = "xxaxxbxxbxbxxbxxbxxbxxdxx" 

consecutive_matches(str, "bcda") #=> "bd" 
consecutive_matches(str, "abcd") #=> "abd" 
consecutive_matches(str, "dabc") #=> "d" 
consecutive_matches(str, "cfgh") #=> "" 
+0

Nicht sicher, ob der Name der Methode geeignet ist. Sollte es nicht "non_consecutive_matches" sein? – sawa

+0

Korrekt. Sequential_but_maybe_not_consecutive_matches passen möglicherweise zur Rechnung. – AuroraTertius

Verwandte Themen