在\ #c regex中将\ r作为\ n处理
我有一个ac#函数,可以在输入端查找文本模式并进行一些处理。 (我使用的是3.5版本的.net框架)
public void func(string s) { Regex r = new Regex("^\s*Pattern\s*$", RegexOptions.Multiline | RegexOptions.ExplicitCapture ); Match m = r.Match(s); //Do something with m }
该函数的使用可能如下所示
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,但我希望我可以最小化操作,如果我可以让正则表达式一次完成所有操作。
不幸的是,当我遇到类似的情况时,我发现有效的唯一情况是我只用正则表达式进行两次传递(就像你希望避免的那样),第一个规范化行结束然后第二个可以进行搜索像往常一样,没有办法让Multiline
在我能找到的/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 }
根据正则表达式中的文档锚点 :
-
Multiline
模式下的^
将匹配输入字符串的开头或行的开头(由\n
定义)。 -
$
inMultiline
模式将匹配输入字符串的结尾,或者恰好在\n
之前。
如果您的目的是重新定义锚点以定义包含\r
和\n
,那么您必须使用前瞻和后视来模拟它。
-
^
应该用(?<=\A|[\r\n])
模拟 -
$
应该用(?=\Z|[\r\n])
模拟
注意,上面的模拟将考虑\r\n
有3个线的开始和3个线的末端。 1行的开始和1行的结束由字符串的开头和结尾定义。 线的另外2个起点和线的2个末端由\r
和\n
定义。
如果将它们放在字符集中,则可以匹配/ n或/ r
[\n\r]
这将匹配\ n或\ r \ n字符之一