我有一个c#函数,可以在输入端查找文本模式并进行一些处理。 (我使用的是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
?我想我总是可以用\r
替换所有\n
s,但是如果我能让正则表达式一次完成所有操作,我希望能最小化操作。
答案 0 :(得分:2)
不幸的是,当我遇到类似的情况时,我发现有效的唯一情况是我只用正则表达式做两次传递(就像你希望避免的那样),第一次规范化行结束然后第二次可以正常进行搜索,无法让我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
}
答案 1 :(得分:2)
根据文件Anchors in Regular Expression:
^
模式下的Multiline
将匹配输入字符串的开头或行的开头(由\n
定义)。$
模式下的Multiline
将匹配输入字符串的结尾,或者恰好在\n
之前。如果您的目的是重新定义锚点以定义同时包含\r
和\n
的行,那么您必须使用前瞻和后视来模拟它。
^
应使用(?<=\A|[\r\n])
$
应使用(?=\Z|[\r\n])
请注意,上面的模拟会考虑\r\n
有3行开头和3行结束。 1行的开始和1行的结束由字符串的开头和结尾定义。行的另外2个开头和行的2个末尾由\r
和\n
定义。
答案 2 :(得分:1)
如果将它们放在字符集
中,您可以匹配/ n或/ r[\n\r]
将匹配\ n或\ r \ n字符之一