2016-11-03 8 views
2
String

Lassen Sie uns sagen, ich habe die folgende Zeichenfolge:Regex - Ersatzzeichen in einem passenden

input = "askl jmsp wiqp;THIS IS A MATCH; dlkasl das, fm" 

Ich brauche die weißen Räume mit Unterstrichen zu ersetzen, sondern nur in den Teil die einem Muster entsprechen. (In diesem Fall wäre das Muster ein Semikolon vor und nach.)

Die erwarteten ausgegeben werden soll:

output = "askl jmsp wiqp;THIS_IS_A_MATCH; dlkasl das, fm" 

Irgendwelche Ideen, wie das zu erreichen, vorzugsweise mit regulären Ausdrücken, und ohne die Aufspaltung Schnur?

Ich habe versucht:

gsub("(.*);(.*);(.*)", "\\2", input) # Pattern matching and 
gsub(" ", "_", input) # Naive gsub 

nicht sie beide zusammen obwohl setzen könnte.

+1

Basierend auf dem Beispiel 'gsub ("(? <= [AZ]) \\ s +", "_", Eingang, perl = TRUE)' arbeitet – akrun

+0

@ WiktorStribiżew 'gsub (" (. *) ; (. *); (. *) "," \\ 2 ", Eingabe) # Pattern matching' und' gsub ("", "_", Eingabe) # Naive gsub. .. Konnte nicht beide zusammen setzen obwohl .. – Deena

+0

Ist die Anzahl der Plätze unbekannt? Wenn nicht, wird Ihr Ansatz funktionieren. –

Antwort

4

die ursprüngliche Frage zu:

Ersatzzeichen in einem passenden Teilzeichen

Sie es mit gsubfn leicht tun können:

> library(gsubfn) 
> input = "askl jmsp wiqp;THIS IS A MATCH; dlkasl das, fm" 
> gsubfn(";([^;]+);", function(g1) paste0(";",gsub(" ", "-", g1, fixed=TRUE),";"), input) 
[1] "askl jmsp wiqp;THIS-IS-A-MATCH; dlkasl das, fm" 

Die ;([^;]+); Matches eine beliebige Zeichenfolge mit ; Start und bis zum nächsten ; Erfassen des Textes dazwischen und Ersetzen Sie dann die Whitespaces durch Bindestriche nur innerhalb des erfassten Teils.

Ein weiterer Ansatz ist es, eine PCRE regex mit einem \G basierten regex zu verwenden, um mit gsub:

p = "(?:\\G(?!\\A)|;)(?=[^;]*;)[^;\\s]*\\K\\s" 
> gsub(p, "-", input, perl=TRUE) 
[1] "askl jmsp wiqp;THIS-IS-A-MATCH; dlkasl das, fm" 

das Sehen online regex demo

Muster Details:

  • (?:\\G(?!\\A)|;) - eine benutzerdefinierte Grenze : entweder das Ende des vorherigen erfolgreichen Spiels (\\G(?!\\A)) oder (|) ein Semikolon
  • (?=[^;]*;) - ein Look-Ahead-Check: Es muss sein, ein ; nach 0+ Zeichen andere als ;
  • [^;\\s]* - 0+ Zeichen andere als ; und Whitespaces
  • \\K - Weglassen des Textes soweit übereinstimmend
  • \\s - 1 einzelnes Leerzeichen (, wenn mehrere Leerzeichen durch 1 Bindestrich ersetzt werden sollen, fügen Sie + danach hinzu).
+1

Vielen Dank @Wiktor – Deena

Verwandte Themen