我有这样一句话:
string wordtoFind = "try";
string test = "this try that, but it can have multiple try in that";
我在类似的问题上尝试了2个RegExp,但是使用它们时遇到了问题。 RegEx应该让我得到我需要找到的单词(在这种情况下尝试,但也可以是其他单词)并在他之前和之后得到这个词(如果在句子的开头或者在句子之后没有单词,请留空或空白端)。
尝试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#,
答案 0 :(得分:2)
你的第二个正则表达式是正确的,它返回为空,因为你在try
之前和之后都没有任何单词char。
答案 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 demo
模式是动态构建的,因此关键字必须为Regex.Escape
d。然后,与\w+
匹配的单词必须跟随非单词符号以匹配整个wordToFind
,因此,您需要添加\W+
。 备选项^\W*
和\W*$
将确保在边缘案例中找到匹配项。
关于逐字字符串文字的注释:使用它们更容易定义正则表达式模式,因为它们允许使用带有正则表达式元类的单个反斜杠(如\w
,\s
等)。
REGEX EXPLANATION :
^\W*
- 匹配字符串的开头,后跟零个或多个非单词字符|
或.... (?<before>\w+)
- 命名的捕获组(通过Match.Groups["before"].Value
获取的值)匹配1个或多个字母或数字或_
的字符。\W+
- 一个或多个不是单词字符的字符(不是字母,数字或_
)。Regex.Escape(wordtoFind)
- 您的关键字(文字)\W+
- 见上文(?<after>\w+)
- 命名捕获组(通过Match.Groups["after"].Value
获取的值)见上文|
- 或...... \W*$
- 字符串结尾前的零个或多个非单词字符。