/ /正規表現検索キーワードの前後の一致-C#、正規表現

RegEx問題の前後に検索語を一致させる - c#、regex

私はこのような文を持っています:

string wordtoFind = "try";
string test = "this try that, but it can have multiple try in that";

同様の質問で見つかった2つのRegExpを試しましたしかし、私はそれらを使用して問題があります。正規表現は、私が見つける必要のある単語を取得し(この場合は試しますが、他の単語でもかまいません)、彼の前後の単語を取得する必要があります(文の先頭または終わり)。

1を試してください:

var matches = Regex.Matches(test, @"(?:\S+\s)?\S*"+wordtoFind+"\S*(?:\s\S+)?", RegexOptions.IgnoreCase);

しかし、マッチは空を返します

2を試してください:

string pattern = @"(?<before>w+)" + wordtoFind + "(?<after>\w+)";
MatchCollection matches = Regex.Matches(test, pattern);

for (int z = 0; z < matches.Count; z++)
{
string error = matches[i].Groups["before"].ToString() + "-" + RetourLabelSansDot + "-" + matches[i].Groups["after"].ToString();
}

空も返す、私はいくつかを倍増しなければならなかった それは私にエラーを投げていたからです。私にとって、RegExは魔法のようなものであり、実際にそれらをカスタマイズする方法はありません。regExに問題がありますか、それとも間違って使用しますか?

これはC#で、

回答:

回答№1は1

ここに正しいコードがあります:

string wordtoFind = "try";
string test = "this try that, but it can have multiple try in that";
string pattern = @"(?:^W*|(?<before>w+)W+)" + Regex.Escape(wordtoFind) + @"(?:W+(?<after>w+)|W*$)";
MatchCollection matches = Regex.Matches(test, pattern);

for (int z = 0; z < matches.Count; z++)
{
string error = matches[z].Groups["before"].ToString() + "-" +wordtoFind + "-" + matches[z].Groups["after"].ToString();
Console.WriteLine(error);
}

見る IDEONEデモ

パターンは動的に構築されるため、キーワードは Regex.Escaped。次に、と一致する単語 w+ 全体に一致するように、非単語記号を続ける必要があります wordToFind、したがって、追加する必要があります W+. 代替案 ^W* そして W*$ エッジケースで一致が検出されるようにします。

そして、逐語的な文字列リテラルに関するメモ:正規表現メタクラスで単一のバックスラッシュを使用できるため、正規表現パターンを定義するのが簡単です( w, s、等)

正規表現の説明

  • ^W* -文字列の先頭で一致し、その後に0個以上の非単語文字が続きます。
  • | または....
  • (?<before>w+) -名前付きキャプチャグループ(経由で取得される値 Match.Groups["before"].Value)文字または数字のいずれかである1つ以上の文字に一致する、または _.
  • W+ -単語文字ではない1つ以上の文字(文字、数字、または _)。
  • Regex.Escape(wordtoFind) -キーワード(リテラル)
  • W+ - 上記を参照
  • (?<after>w+) -名前付きキャプチャグループ(経由で取得される値 Match.Groups["after"].Value) 上記を参照
  • | - または...
  • W*$ -文字列の末尾の前にあるゼロ個以上の非単語文字。

回答№2については2

2番目の正規表現は正しいです。前後にcharという単語が存在しないため、空を返します。 try.