正则表达式在测试器中有效,但在我的代码中无效[重复]

Posted

技术标签:

【中文标题】正则表达式在测试器中有效,但在我的代码中无效[重复]【英文标题】:Regular expression works in tester but not in my code [duplicate] 【发布时间】:2014-07-25 22:43:56 【问题描述】:

这是我的代码。

        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 测试器中测试正则表达式和文本,它可以找到匹配项。

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

【问题讨论】:

对 Regex 知之甚少,但我记得 SingleLine 和 MultiLine 选项非常不直观,并且在我曾经使用的至少一个测试程序中实现不一致。跨度> 我使用了来自 Ultrapico 的名为 Expresso 的测试程序并取得了一些成功。也有在线 Regex 测试页面,但通常不兼容 .Net。 【参考方案1】:

问题在于你的行尾。

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

只需在匹配之前插入这些行,它就会起作用:

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

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

【讨论】:

【参考方案2】:

尝试做这样的事情:

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

【讨论】:

看起来您只是将静态方法更改为实例方法。问题依然存在。【参考方案3】:

我可能会解决问题。我删除了模式中的 ^ 和 $,现在我有 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();

【讨论】:

这是一个错误的解决方案,因为当您删除^$ 时,您将不再匹配整行。如果您需要解决方案,则需要做其他事情。

以上是关于正则表达式在测试器中有效,但在我的代码中无效[重复]的主要内容,如果未能解决你的问题,请参考以下文章

我的 API url 在 Chrome 浏览器中有效,但在我的测试 apache 本地主机环境中无效

正则表达式搜索 - 在测试人员中工作,而不是在Spyder中[重复]

Swift 中的 AudioToolBox - 声音在模拟器中有效,但在我的 iPad 上无效

重复的 typedef - 在 C 中无效但在 C++ 中有效?

Gatsby 查询在 graphql 编辑器中有效,但在反应代码中无效

C ++的函数正则表达式在linux(CentOS)中但在OSX中遇到错误[重复]