C# 正则表达式在tester中工作,但在我的代码中不工作

C# 正则表达式在tester中工作,但在我的代码中不工作,c#,.net,regex,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<c

这是我的密码

        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();
        }
static void Main(字符串[]args)
{
字符串模式=
@“^(?.*?(\w+)(.*?)$
^(?*?)\k(?.*?)$
^\k(?\w+)\k$
^\k\k\k$”;
字符串文本=
@“如果(forwardRadioButton.IsChecked.Value)
轿厢=轿厢向前(距离);
else if(backwardRadioButton.IsChecked.Value)
汽车=汽车向后(距离);
else if(forwardLeftRadioButton.IsChecked.Value)
汽车=汽车。左前(距离);“;
var mc=Regex.Matches(文本、模式、RegexOptions.IgnoreCase | RegexOptions.Multiline);
控制台写入线(mc计数);
Console.ReadKey();
}
它找不到匹配项。

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


我的代码中有什么遗漏吗?如何使模式工作?

尝试这样做:

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

我可能解决了这个问题。我删除了模式中的^和$,现在有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();
字符串模式=
@“^(?.*?(\w+)(.*?)
(?*?)\k(?.*?)
\k(?\w+)\k
\k\k\k$”;
字符串文本=
@“如果(forwardRadioButton.IsChecked.Value)
轿厢=轿厢向前(距离);
else if(backwardRadioButton.IsChecked.Value)
汽车=汽车向后(距离);
else if(forwardLeftRadioButton.IsChecked.Value)
汽车=汽车。左前(距离);“;
var mc=Regex.Matches(文本、模式、RegexOptions.IgnoreCase | RegexOptions.Multiline);
控制台写入线(mc计数);
Console.ReadKey();

问题在于您的行尾

在代码中创建的内联字符串以
\r\n
结尾,而正则表达式引擎希望
\n
匹配
$

只需在匹配之前插入这些行,就可以了:

 pattern = pattern.Replace("\r\n", "\n");
 text = text.Replace("\r\n", "\n");

这去掉了
\r
,一切都应该很好。

对正则表达式知之甚少,但我记得单线和多线选项非常不直观,并且在我一次使用的至少一个测试程序中实现不一致。我使用了Ultrapico的一个名为Expresso的测试程序,取得了一些成功。也有在线正则表达式测试页面,但通常不兼容.Net。看起来您只需将静态方法更改为实例方法。问题仍然存在。这是一个错误的解决方案,因为当您删除
^
$
时,您不再匹配整行。如果你需要一个解决方案,你需要做些别的事情。