将\r\n视为c#regex中的
我有一个c#函数,它在输入端查找文本模式并进行一些处理。(我使用的是.net framework的3.5版本) 函数的用法可能如下所示将\r\n视为c#regex中的,c#,regex,C#,Regex,我有一个c#函数,它在输入端查找文本模式并进行一些处理。(我使用的是.net framework的3.5版本) 函数的用法可能如下所示 string s = "Pattern \n Pattern \n non-Pattern"; func(s); string s = "Pattern \r Pattern \r non-Pattern" func(s); 然而,我发现有时我的输入看起来更像这样 string s = "Pattern \n Pattern \n non-Pattern";
string s = "Pattern \n Pattern \n non-Pattern";
func(s);
string s = "Pattern \r Pattern \r non-Pattern"
func(s);
然而,我发现有时我的输入看起来更像这样
string s = "Pattern \n Pattern \n non-Pattern";
func(s);
string s = "Pattern \r Pattern \r non-Pattern"
func(s);
而且它没有被匹配。有没有办法将
\r
视为正则表达式中的\n
?我想我总是可以用\n
s替换所有\r
s,但我希望如果我可以让正则表达式一次完成所有操作,我可以最小化操作。如果将它们放在字符集中,可以匹配/n或/r
[\n\r]
这将匹配\n或\r字符中的一个不幸的是,当我遇到类似的情况时,我发现唯一有效的情况是我只需使用正则表达式进行两次传递(就像您希望避免的那样),第一次规范化行尾,然后第二次可以正常进行搜索,没有办法让
多行
在我能找到的/r
上触发
public void func(string s)
{
s = Regex.Replace(s, @"(\r\n|\n\r|\n|\r)", "\r\n");
Regex r = new Regex("^\s*Pattern\s*$", RegexOptions.Multiline | RegexOptions.ExplicitCapture );
Match m = r.Match(s);
//Do something with m
}
根据文件:
- 在
模式下,多行
将匹配输入字符串的开头或行的开头(如^
所定义)\n
在$
模式下,将匹配输入字符串的结尾,或正好在多行
之前\n
\r
又有\n
的线,则必须使用“向前看”和“向后看”对其进行模拟
应该用^
来模拟(?是的,我想我必须做一些类似的事情。我想知道为什么
与$
不匹配?感觉应该是这样。因为\r
不被认为是windows行结尾,.NET是windows技术。“多行”的定义不是ReGEX的一个特性,而是一个.NET添加到ReEX中的特性,因此没有任何标准可以遵循。我认为2遍解决方案是有意义和更容易维护的。只是想知道为什么<代码> \n\r>代码>被认为是1行的末尾?我只是尝试得到所有可能的畸形数据的组合,我想我以前没有击中过它,但是<代码> \r 在任何情况下都不被认为是一个有效的结尾,而在一个只有\r
的数据源中运行是促使我编写复制并粘贴上述代码的代码段的原因。谁知道呢,也许有一天我会遇到来自BBC微系统的数据:)我当然不希望\r
成为新行,并将其从我的单元测试中排除(这些测试都通过了\r
!)。但是,由于\n
出现在我预期的\r
位置,我的代码开始无法运行。请更新有关如何定义行的问题。这个答案定义了以\n
或\r
结尾的一行。我不确定是否完全理解你的意思。对于我的应用程序,\n
只有一两行没有任何区别。只要\r\n
作为输入文本的整行存在,我就可以匹配这种模式
@MarkB42:这取决于您的模式。现在我还不能给出一个例子,但我相信某些模式会有所不同。模式的每一行