正規表現は全体の単語に一致する?

私の質問特殊文字と全単語を一致させるための正規表現は何ですか?を参照して、

私は答えた

@"(?<=^|\s)" + pattern + @"(?=\s|$)"

これは、1件を除くすべてのケースで正常に機能します。パターンにスペースがあると失敗します。

文字列が "こんにちは、これはstackoverflow"であり、パターンは "this"であると仮定します。これはpattern内の実際の文字列の後に空白があるために発生します。

これはどのように処理できますか?理想的に言えば、1つのマッチが見つかりました!

0
単純に呼び出し側のレイヤーからパターンをトリミングすることはできませんでしたか?これがユーザ入力であると仮定すると、ユーザ入力をトリミングしてサービス層に送ることができます。
追加された 著者 Steve B,

1 答え

これを試して

(?:(?<=^|\s)(?=\S)|(?<=\S|^)(?=\s))this (?:(?<=\S)(?=\s|$)|(?<=\s)(?=\S|$))

See it here on Regexr

これは、空白で始まるパターンに対しても機能します。

Basically, what I am doing is to define a custom "word" boundary. But it is not true on a \W=>\w or a \w=>\W change, its true on a \S=>\s or a \s=>\S change!

ここにc#の例があります:

string str = "Hi this is stackoverflow";
string pattern = Regex.Escape("this");
MatchCollection result = Regex.Matches(str, @"(?:(?<=^|\s)(?=\S)|(?<=\S|^)(?=\s))" + pattern + @"(?:(?<=\S)(?=\s|$)|(?<=\s)(?=\S|$))", RegexOptions.IgnoreCase);

Console.WriteLine("Amount of matches: " + result.Count);
foreach (Match m in result)
{
    Console.WriteLine("Matched: " + result[0]);
}
Console.ReadLine();

更新:

この "空白"の境界はより一般的に行うことができるので、パターンの両側で同じような表現ができます

(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$))

C#で:

MatchCollection result = Regex.Matches(str, @"(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$))" + pattern + @"(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$))", RegexOptions.IgnoreCase);
8
追加された
完璧! ......
追加された 著者 Legends,
@pratZ、何が失敗していますか?私にとってはうまくいっていますし、理由が分からず、なぜC ++のようなものでなければならないのでしょうか。
追加された 著者 stema,
あなたが使用するパターンに依存する@pratZ ......この質問ではカバーされていません。ここでは、「c ++ c」を2つの単語とみなします。
追加された 著者 stema,
ほとんどすべての場合に動作しますが、 "c ++ c c#"の "c ++ c"
追加された 著者 pratZ,
'c ++'にマッチすればマッチしますが、 'c ++ c c#'というテキストに 'c ++ c'とマッチすれば失敗します
追加された 著者 pratZ,
あなたの答えは非常に役に立ちます。 'c ++'では動作しますが、 'c ++'のようなものとは一致しません。その全体の言葉(最後に空白があります)は、私は質問には載っていない点があります。確かにこのような場合があります。
追加された 著者 pratZ,