2016-09-15 4 views
1

Ich versuche zu ersetzen? mit „Ein“, wenn nachfolgenden Wort beginnt mit einem VokalTeil des gesuchten Musters in Regex zurücksetzen

(define (f str) 
    (println (regexp-replace* #rx"\\? [aeiou]" str "An "))) 

(f "? apple.") 

Es funktioniert, aber es nimmt ‚a‘ von ‚Apfel‘. Die Ausgabe lautet:

"An pple." 

Mit '&' -Muster gesamte Such zurück in String ersetzt:

(println (regexp-replace* #rx"\\? [aeiou]" str "An &")) 

Ausgang:

"An ? apple." 

Wie kann ich wieder nur 'a' oder was auch immer Vokal wurde am Anfang des Wortes gefunden?

+0

Probieren Sie eine Erfassungsgruppe für '([aeiou])' und schreiben Sie sie dann in die Ersetzung zurück . Oder, wenn die Engine dies unterstützt, verwenden Sie eine Lookahead Assertion '(? = [Aeiou])' – sln

+0

Beide funktionieren, aber die Ausgabe bleibt gleich. – rnso

+0

Warum sind diese Klammern "\\ [\\? \\]" und nicht diese "[aeiou]" ist das BRE-Aroma? In einem echten Sinn ist die Regex das? (? = [aeiou]) 'und ersetzen ist' An '_or_' \? ([aeiou]) 'und ersetzen ist' An $ 1' – sln

Antwort

1

In einem realen Sinne ist die regex diese

Suche: \? (?=[aeiou])
ersetzen: An

oder wenn Sie eine Capture-Gruppe

Suche ersetzen zurück: \? ([aeiou])
ersetzen: An $1

+0

(regexp-ersetzen * #rx" \ \? ([aeiou]) ""? apple. "" Ein $ 1 ") erzeugt" An $ 1pple ". Dies funktioniert ordnungsgemäß: (regexp-replace * #rx" \\? (? = [aeiou]) ""? Apfel. "" Eine ") Ausgabe ist:" Ein Apfel. " – rnso

+0

Irgendwie seltsam. Irgendwie sollte es Capture-Gruppenreferenz in der Ersetzung unterstützen. Manchmal wird ein Backslash anstelle von $ verwendet, normalerweise wie' \ 1', aber ich don ' Ich kenne ihre Verwendung. Viel Glück! – sln

Verwandte Themen