RegEx问题匹配搜索字词

时间:2016-01-13 15:33:56

标签: c# regex

我有这样一句话:

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#,

2 个答案:

答案 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*$ - 字符串结尾前的零个或多个非单词字符。