私はこのような文を持っています:
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.Escape
d。次に、と一致する単語 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
.