2017-06-18 7 views
2

正規表現@"\bAND\b|\bOR\b|""|\(|\)"を使用して、特定の単語や文字を文字列から取り除きます。私はregex.replaceを使用する場合正規表現 - 置き換えられた文字の間にスペースを追加

、正規表現がうまく出ストリングス「OR」が、2つの耳のヘッドフォンで

耳のヘッドフォンで「OR」:私が持っている問題は、次のテキストが使用されている場合ということですクエリは、耳のheadphonesonの耳のヘッドフォンで一緒に

マッシュされます

私はストリップしたい単語や他のクエリ用語間の単語の間にスペースがない場合にのみ発生します。存在しない場合、除外したいキーワードの間に空白を追加するエレガントな方法はありますか?

+0

である:(\ sの*の\ bの? AND | OR)\ b \ s * | [() "" \ 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 = Over + ear + headphones %22OR%22on + ear + headphones%0d%0aOver + ear + headphones +%22OR%22 + on + ear + headphones&r = +)スペースで置き換えてください。 –

答えて

1

私はそれがばかげているかもしれないことは知っていますが、これを取り除く代わりに1つのスペースで置き換えようとしましたか?

0

置換テキストに関係なくスペースを追加してから、この条件に当たっていないときに2つ以上のスペースを取り除くために後続の正規表現を置き換えます。

このようにして、各単語の間にスペースが1つあることが保証されます。

これは、簡潔にするために(あなたの引用された"OR"なし)基本的な例ですが、考え方は同じです:

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

結果

Over ear headphones on ear headphones 
+0

'Regex.Replace(txt、@" OR \ s * "、" ");'のように、最初のスペースにマッチすれば簡単にはなりません。それで、Regexを2回交換する必要はありません。 –

+0

@ジュリアンは答えとしてそれを入れました。 :-) – OmegaMan

0

これは、既存のフォーマット(だけでなく、缶を保存する必要があります予想された)。

[^\s\r\n]
または類似で\sに置き換え、非改行空白を使用します。


だけで、必要に応じてお好みの空白で置き換え、その後、表現のどちらかの側に単一の空白を消費します。

これは、テキストで囲まれた項目に対して行われます。
が空の文字列に置き換えた文字列の先頭や末尾の項目について

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 

これは( `@" [試し正規表現@"(^)?\s?(?:\b(?:AND|OR)\b|[()""])+\s?($)?"

拡張

(^)?      # (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 " "; 
    })); 

出力

"Over ear headphones"OR"on ear headphones" 
Over ear headphones on ear headphones 
関連する問題