正则表达式在测试器中工作,但不在我的代码中

时间:2014-06-05 04:38:29

标签: c# .net regex

这是我的代码。

        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();
        }

无法找到匹配项。 enter image description here

但是,如果我在.NET测试程序中测试正则表达式和文本,它可以找到匹配项。

enter image description here

我的代码中是否遗漏了任何内容?如何使模式工作?

3 个答案:

答案 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();