2016-11-21 4 views
5

を置き換える、正規表現パターンの私は「いいえ」で、「#」を交換する必要があるの文章、「名前#2」、</p> <p>を持って

最後の文は、「名前号である必要があります2 "となる。

コード -

string sentence = Regex.Replace("Name # 2", "\\#\\b", "No."); 

はどうやらRegex.Replaceが「いいえ」と「#」を置き換えるために失敗し、問題にアプローチする正しい方法は、正規表現を経由して、そこにあります。 感謝 のようになります実行し、一般的なコードがありますので、私は正規表現パターンを探しています理由は、コンテキスト

 string pattern = string.Format(@"\b{0}\b", context); 

    sentence = System.Text.RegularExpressions.Regex.Replace(sentence, pattern, suggestion); 

以下 - 「#」を

文 - 「名前#2」

提案 - 「いいえ」 "名前2号"

実際の文章 - - "名前#2"

コンテキスト -

の提案を "彼が行っていた" -

文 "だった" の文章期待

- "は"

期待される文 - "彼は行っていた"

実際の文章は - 「彼は行く時点でいた。」 - 「」

文を -

コンテキストを「彼が行っていました」

の提案 - "Z"

期待文 - あなたが試すことができ

+3

OMG!なぜ正規表現ですか? –

+0

@ThomasWeller私は自分の質問を編集しました。 – Sandepku

+0

'\ b'は単語境界(英数字とその他の間)に一致します。あなたの入力に '# 'の隣にそのような境界はありません。 –

答えて

6

Regex.Replace("Name # 2", "#", "No.") 

あるいは単なる古いstring.Replace:正規表現を使用して

4
string test = "Name # 2"; 

test = test.Replace("#", "No."); 
+0

申し訳ありませんが、私は正規表現を経由する必要がありました。 – Sandepku

+0

test = Regex.Replace(test、 "#"、 "No"); – mybirthname

+0

@Sandepku正規表現を使用する必要がある理由について説明してください(あなたの投稿を編集する必要があります)。 –

3

を "彼は行く時間にZ地点にあった":

string sentence = Regex.Replace("Name # 2", "#", "No."); 

#はエスケープする必要はありません。したがって、バックスラッシュの必要はありません。 #がAで先行された場合、現在の正規表現が一致しません

"Name # 2".Replace("#", "No."); 
+0

私はたくさん試してみることができます。なぜそれは動作すると思いますか? –

2

あなたはそうのようにそれを行うことができますword char、文字、数字またはアンダースコア。これは、単語境界の意味が文脈に依存するために起こります。

は、以下の修正のいずれかに置き換えます

string pattern = string.Format(@"(?<!\w){0}(?!\w)", Regex.Escape(context)); 
           ^^^^^^ ^^^^^^ 

(?<!\w)(?!\w)先行しない場合/単語の文字が続く状況独立しており、単語に一致します。

あるいは、(?<!\S)負後読みが「単語」の前に空白文字または文字列の開始を必要とし、負の先読み(?!\S)必要に応じてのみ空白(S)の内部の単語を一致させるために

string pattern = string.Format(@"(?<!\S){0}(?!\S)", Regex.Escape(context)); 

を使用"単語"の後の文字列または空白の終わり。

ユーザ入力/動的パターンの作成に対処するときに、リテラル文字列を正規表現パターン内で使用する必要がある場合は、Regex.Escapeが必須であることに注意してください。そうでなければパターンを壊す可能性のある特殊文字(?+など)をエスケープします。

関連する問題