C#正则表达式不匹配其他正则表达式测试工具匹配的模式。
C#正则表达式不匹配其他正则表达式测试工具匹配的模式。
假设我有以下文本,我想提取在"Start of numbers"和"End of numbers"之间的文本。这些行的数量是动态的,唯一变化的是其中的数字,例如:第一行,第二行等等。每个文件中在"Start of numbers"和"End of numbers"之间的行数是不同的。如何编写一个正则表达式来匹配"Start of numbers"和"End of numbers"之间的内容,而不知道文件中将有多少行在它们之间?
谢谢!
这是第一行 这是第二行 Start of numbers 这是第一行 这是第二行 这是第三行 这是......行 这是第九行 End of numbers
问题的原因是使用的正则表达式无法匹配多行字符串。解决方法是在正则表达式中添加正确的换行字符(\n)。
首先,我们来看一下代码示例:
string pattern = "Start of numbers(.|\n)*End of numbers"; Match m = Regex.Matches(input, pattern);
在上述代码中,我们定义了一个正则表达式模式,用于匹配以"Start of numbers"开头,以"End of numbers"结尾的字符串。其中,(.|\n)*表示匹配任意字符或换行字符的零个或多个重复。
然而,这段代码在实际运行中可能无法正确匹配多行字符串。原因是在C#中,"."默认不会匹配换行符。因此,如果我们的输入字符串包含换行符,那么上述正则表达式将无法匹配成功。
为了解决这个问题,我们需要修改正则表达式,使其能够正确匹配多行字符串。具体做法是将换行字符"\n"添加到正则表达式中,以表示换行符。修改后的代码如下所示:
string pattern = "Start of numbers(.|\n|\r\n)*End of numbers"; Match m = Regex.Matches(input, pattern);
在上述修改后的代码中,我们将"\n"添加到了正则表达式中,以表示换行符。此外,我们还添加了"\r\n",用于匹配Windows平台上的换行符。
通过以上修改,我们可以确保正则表达式能够正确匹配多行字符串,解决了原始代码中无法匹配多行字符串的问题。
问题的原因是正则表达式中使用了dotall标记(/s),但是在C#中默认不支持该标记。解决方法是在正则表达式的开头加上(?s)来启用dotall标记。
以下是整理后的文章:
在使用C#的正则表达式时,有时会遇到一种情况,即正则表达式无法匹配其他正则表达式测试工具能够匹配的模式。这个问题的出现是由于正则表达式中使用了dotall标记(/s),而在C#中默认不支持该标记。
举个例子来说明这个问题。假设我们有一个正则表达式,用于匹配以"Start of numbers"开头,以"End of numbers"结尾的字符串。正则表达式如下所示:
/(?<=Start of numbers).*(?=End of numbers)/s
我们可以在http://regexr.com?30oaj这个网站上测试这个正则表达式。在这个测试工具中,我们可以看到该正则表达式能够成功地匹配我们想要的模式。
然而,当我们在C#中使用相同的正则表达式时,却无法得到匹配结果。这是因为在C#中,默认情况下是不支持dotall标记的。
要解决这个问题,我们需要在正则表达式的开头加上(?s)来启用dotall标记。修改后的正则表达式如下所示:
/(?s)(?<=Start of numbers).*(?=End of numbers)/
通过这个简单的修改,我们就可以在C#中成功地匹配到我们想要的模式了。
总结起来,当我们在C#中使用正则表达式时,有时会遇到无法匹配其他正则表达式测试工具能够匹配的模式的问题。这是因为C#默认不支持dotall标记。我们可以通过在正则表达式的开头加上(?s)来启用dotall标记,从而解决这个问题。
问题出现的原因是C#正则表达式中的`.`匹配除`\n`之外的任何字符,而其他正则表达式测试器中的`.`匹配任何字符。解决方法是在C#正则表达式中使用`SingleLine`模式,告诉正则表达式`.`匹配任何字符(不包括`\n`)。代码示例如下:
var regex = new Regex("Start of numbers(.*)End of numbers", RegexOptions.IgnoreCase | RegexOptions.Singleline);
我从来没有听说过这个。我不是说你错了,但是文档链接似乎没有提到这一点,这个正则表达式链接也没有提到:
.: 没有。SingleLine影响`.`,MultiLine影响`^`和`$`。是的,有时候指定`SingleLine`和`MultiLine`都是有意义的。:-)
是的,你是对的。MultiLine影响`^`和`$`,我原以为SingleLine也会影响,但是看文档发现并不是这样。