这是我的代码。
static void Main(string[] args)
{
string pattern =
@"^(?<p1>.*?)(?<c0>\w+)(?<s1>.*?)$
^(?<p2>.*?)\k<c0>(?<s2>.*?)$
^\k<p1>(?<c1>\w+)\k<s1>$
^\k<p2>\k<c1>\k<s2>$";
string text =
@" if (forwardRadioButton.IsChecked.Value)
car = car.Forward(distance);
else if (backwardRadioButton.IsChecked.Value)
car = car.Backward(distance);
else if (forwardLeftRadioButton.IsChecked.Value)
car = car.ForwardLeft(distance);";
var mc = Regex.Matches(text, pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline);
Console.WriteLine(mc.Count);
Console.ReadKey();
}
无法找到匹配项。
但是,如果我在.NET测试程序中测试正则表达式和文本,它可以找到匹配项。
我的代码中是否遗漏了任何内容?如何使模式工作?
答案 0 :(得分:4)
问题在于您的行结尾。
您在代码中创建的内联字符串以\r\n
终止,而正则表达式引擎需要\n
才能匹配$
。
只需在匹配前插入这些行,它就可以工作:
pattern = pattern.Replace("\r\n", "\n");
text = text.Replace("\r\n", "\n");
这剥离了\r
,一切都很好。
答案 1 :(得分:0)
尝试做这样的事情:
string yourtext = "yourtext";
Regex yourregex = new Regex(@"put your regex pattern here" , RegexOptions.IgnoreCase | RegexOptions.Multiline);
//put Matches in Collection
MatchCollection matchesCollection = yourregex.Matches(yourtext);
//output
Console.WriteLine(matchesCollection.Count);
答案 2 :(得分:0)
我可能解决了这个问题。我删除了模式中的^和$,现在我有1个匹配。
似乎如果模式本身有多行,则不应将^和$放在中间行。
string pattern =
@"^(?<p1>.*?)(?<c0>\w+)(?<s1>.*?)
(?<p2>.*?)\k<c0>(?<s2>.*?)
\k<p1>(?<c1>\w+)\k<s1>
\k<p2>\k<c1>\k<s2>$";
string text =
@" if (forwardRadioButton.IsChecked.Value)
car = car.Forward(distance);
else if (backwardRadioButton.IsChecked.Value)
car = car.Backward(distance);
else if (forwardLeftRadioButton.IsChecked.Value)
car = car.ForwardLeft(distance);";
var mc = Regex.Matches(text, pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline);
Console.WriteLine(mc.Count);
Console.ReadKey();