2017-06-18 3 views
2

Ich habe eine Regex @"\bAND\b|\bOR\b|""|\(|\)", die bestimmte Wörter oder Zeichen aus einer Zeichenfolge entfernt. Das Problem, das ich habe, ist, dass, wenn der folgende Text verwendet:Regex - Leerzeichen zwischen ersetzten Zeichen hinzufügen

Over Ear-Kopfhörer „ODER“ auf Ohr-Kopfhörer

Als ich Regex.Replace verwenden, erfolgreich die beiden regulären Ausdrücke aus ‚OR‘ aber die beiden Abfragen werden

über Ohr headphoneson Ohr Kopfhörer

Dies geschieht nur püriert zusammen, wenn es nicht ein Raum zwischen dem Wort zwischen dem Wort abzustreifen ich will, ist und die anderen Suchbegriffen. Gibt es eine elegante Möglichkeit, Leerzeichen zwischen Keywords hinzuzufügen, die entfernt werden sollen, wenn keine vorhanden sind.

+0

Try [ '@" (?: \ S * \ b (UND | ODER) \ b \ s * | [() ""]] + "'] (http://regexstorm.net/tester?p =% 28% 3f% 3a% 5cs *% 5cb% 28AND% 7cOR% 29% 5cb% 5cs *% 7c% 5b% 28% 29% 22% 22% 5cs% 5d% 29% 2b & i = Über + Ohr + Kopfhörer % 22OR% 22on + Ohr + Kopfhörer% 0d% 0aOver + Ohr + Kopfhörer +% 22OR% 22 + on + Ohr + Kopfhörer & r = +) und durch ein Leerzeichen ersetzen. –

Antwort

1

Ich weiß, dass es albern klingen mag, aber haben Sie versucht, dieses durch ein einzelnes Leerzeichen zu ersetzen, anstatt es nur zu entfernen?

0

Fügen Sie unabhängig vom Ersetzungstext ein Leerzeichen hinzu, und erstellen Sie anschließend einen nachfolgenden regex replace, um 2 oder mehr Leerzeichen auszublenden, wenn diese Bedingung nicht erreicht wird.

Auf diese Weise ist garantiert, dass ein Leerzeichen zwischen jedem Wort steht.

Dies ist ein einfaches Beispiel (ohne Ihre "OR" zitiert) der Kürze halber, aber das Konzept ist das gleiche:

Regex.Replace(Regex.Replace(txt, "OR", " "), @"\s\s", " ") 

Ergebnis

Over ear headphones on ear headphones 
+0

Wäre es nicht einfacher, wenn Sie nur irgendwelche Leerzeichen an erster Stelle finden, wie: 'Regex.Replace (txt, @" ODER \ s * "," ");'? Dann müssten Sie Regex.Replace nicht zweimal aufrufen. –

+0

@JulianA setzen es als Antwort ein. :-) – OmegaMan

0

Dies das bestehende Format (wie auch Dose erhalten sollte erwartet werden).

Nicht-Zeilenumbrüche Leerzeichen verwenden, ersetzen Sie den \s mit [^\s\r\n]
oder ähnliches.


nur optional ein einzelnes Leerzeichen auf beiden Seiten des Ausdrucks verbrauchen, dann mit einem Leerzeichen Ihrer Wahl ersetzen.

Dies ist für Elemente mit Text umgeben.

A<sp><item>B  => A<sp>B 
A<sp><item>B<sp> => A<sp>B 
A<item><sp>B  => A<sp>B 
A<item>B   => A<sp>B 

Für Elemente am Anfang oder Ende des Strings
mit dem leeren String ersetzen.

Dies ist die regex @"(^)?\s?(?:\b(?:AND|OR)\b|[()""])+\s?($)?"

Expanded

(^)?      # (1) 
\s? 
(?: 
     \b 
     (?: AND | OR) 
     \b 
    | [()"] 
)+ 
\s? 
($)?      # (2) 

C#

string sTrg = @"""Over ear headphones""OR""on ear headphones"""; 
Console.WriteLine("{0}", sTrg); 

Regex rX = new Regex(@"(^)?\s?(?:\b(?:AND|OR)\b|[()""])+\s?($)?"); 
Console.WriteLine("{0}", rX.Replace(sTrg, 
    delegate (Match m) { 
     if (m.Groups[1].Success || m.Groups[2].Success) 
      return ""; 
     return " "; 
    })); 

Ausgabe

"Over ear headphones"OR"on ear headphones" 
Over ear headphones on ear headphones 
Verwandte Themen