不以子字符串开头的字符串的正则表达式是什么

时间:2011-10-10 08:47:09

标签: c# regex

如果字符串不在字符串的开头,那么匹配单词的正则表达式是什么?例如,要匹配United,字符串应为"We are United on it"。它不应与"United States"匹配。我使用了表达式\w+\s+(United),但在匹配时返回are United。我只想要United匹配。

我将使用什么表达方式?而且,由于我将替换匹配的表达式,我是否需要一个循环来替换多次出现?

以下是代码的一部分:

     var s = "We are United on it.";
     var regex = new Regex(@"\w+\s+(United)", RegexOptions.IgnoreCase);
         if (regex.IsMatch(s))
         {
             returnString = Regex.Replace(s,@"\w+\s+(United)" , "xyz");
         }

任何代码示例都会非常有用。谢谢!

4 个答案:

答案 0 :(得分:3)

一般情况下,如果您想对匹配的旁边的内容施加条件,但未在匹配中包含文本,则需要断言,例如

之一
(positive or negative) (look-behind or look-ahead)

在这种情况下,我们想要在匹配前确定之前的内容,因此我们需要一个后视断言。而且我们想要断言的是:“就在比赛开始之前,有字符串的开头”,我们需要一个负面的后置断言:< / p>

string shouldPass = "We are United";
string shouldFail = "United we stand";

var regex = new Regex("(?<!^)United");

Console.WriteLine("{0} result: {1}", shouldPass, regex.IsMatch(shouldPass));
Console.WriteLine("{0} result: {1}", shouldFail, regex.IsMatch(shouldFail));

Console.ReadKey();

后置否定断言的语法为(?<!text),将text替换为您所说的 not 恰好在匹配之前出现的内容。

另外一点,您实际上不需要单独调用.IsMatch.Replace - .Replace如果没有匹配则不会执行任何操作。

并且您不需要循环 - .Replace将替换所有匹配,除非您专门调用限制替换次数的重载。

答案 1 :(得分:2)

(?<=\w+\s+)United
仅当在其之前找到字母数字“单词”和空格时,

才匹配United

因此,

Console.WriteLine(Regex.Replace("We are united on it.", @"(?<=\w+\s+)United", "xyz", RegexOptions.IgnoreCase));

将导致

We are xyz on it.

另一个具有不同逻辑的版本(不确定您需要哪一个):

United(?!\s+States)
仅当United后面没有States时,

才匹配{{1}}。

这些结构称为lookaround assertions

答案 2 :(得分:0)

Regex regexObj = new Regex(@"^\s*\w+\s+(United)");

这意味着从字符串的开头开始,在匹配单词之前,应该至少有一些空格和一些字符。

答案 3 :(得分:0)

问题是,\w+\s+也匹配,并且也被替换。我认为最简单的方法是将这部分放入一个捕获组中并将其放入替换中。

var s = "We are United on it.";
Console.WriteLine(Regex.Replace(s, @"(\w+\s+)United", "$1xyz", RegexOptions.IgnoreCase));
Console.ReadLine();

会打印

  

我们是xyz。