2017-01-05 12 views
-1

"H l l o Everyone"のように書かれた単語を "Hello Everyone"に変換する正規表現を作成しようとしています。C#すべての文字が空白で区切られた単語を絞り込む正規表現

"こんにちは、みなさん、どうですか?"のようにスペースで区切られた単語の場合、何も起こりません。

基本的にすべての単一の文字は単語を作るために絞られなければならず、2つ以上の文字がこのパターンに従っているかどうかを検討できます。

それは "AB CDEF" のようなものである場合 - 何も しかし、 "ABCのDEFを" 起こるべきではありません - > "ABC DEF"

私はこの「^ \(ワットのようなものを試してみました:(\ s)は\ wの? )* $ "でも" Hello world "と一致しています。

また、私はこれらの単一の文字をどのように絞るかについてはわかりません。

ご協力いただきまして誠にありがとうございます。

ありがとうございます!

+0

'(?<!\ S)(\ w)\ s(?!\ w {2})'を試し、 '$ 1'で置き換えてください。 –

+0

regex101オンラインエディタで試してみたところ、次のように書かれています: "先行するトークンは定量化できません" – Chandra550

+0

意味が分かりません。空白文字/文字列の先頭に続く任意の単語の文字にマッチするように[パターン](https://regex101.com/r/2UWvXV/1)を提案し、その後に2文字の文字を伴わない空白を続けました。 –

答えて

1

単一の空白文字で区切られた1つの文字チャンクをマッチさせて、マッチエバリュエーター内の空白を削除することをお勧めします。

正規表現は

(?<!\S)\w(?:\s\w){2,}(?!\S) 

RegexStormでそのデモを参照してくださいです。 (?<!\S)(?!\S)は、これらのチャンクが空白で囲まれていることを確認します(または文字列の開始/終了位置にあります)。

詳細

  • (?<!\S) - 負の後読み確認が空白があるか、現在の場所
  • \w直前の文字列の先頭作る - ワード文字(英字/数字/アンダースコア、へ文字と一致し、代わり\p{L}を使用)
  • (?:\s\w){2,} - の2以上の配列:
    • \s - 空白
    • \w - 単語文字
  • (?!\S) - 否定先読みが空白があるか

C# demoを参照してください、すぐに現在の場所後の文字列の開始を確認すること:

var res = Regex.Replace(s, @"(?<!\S)\w(?:\s\w){2,}(?!\S)", m => 
    new string(m.Value 
     .Where(c => !Char.IsWhiteSpace(c)) 
     .ToArray())); 
+0

なぜ、空白に先んじて肯定的な見解よりも「空白でない」というネガティブな先読みを使用したのですか? –

+1

@RichardSzalay:ほとんどの人が「隠されている」と言っていることは理解していますが、アンカーとの交代を避けることは非常に効率的です。肯定的なアプローチを使用した場合は、 '(?<= \ s | ^)'と '(?= \ s | $)'が必要です。オルタネーションはすでにリソースを消費しており、ゼロ幅アサーション内で使用するとパターンの複雑さが増します。 –

0

は、あなたが純粋な正規表現のソリューションを探しているなら、

Regex.Replace(s, @"(?<=^\w|(\s\w)+)\s(?=(\w\s)+|\w$)", string.Empty); 

は(何もそれぞれの側の少なくとも1つのスペースと文字のペアでスペースを置き換える処理するために少し余分に文字列の開始/終了)。

関連する問題