为何含\r\n换行符的文件使Regex匹配失败?如何兼容两种换行?
正则匹配\r\n换行文件失败的原因及解决方法
失败原因
你启用的Multiline模式下,正则中的$仅匹配换行符(\n)的前一个位置。当文件使用\r\n作为换行时,每行末尾会多出一个\r字符。而你的原正则结尾部分([\\*?#\w.]+\.sql[\t ]*)+$里,[\t ]*只能匹配空格或制表符,无法匹配\r,导致正则无法触发行尾的$匹配条件,最终匹配失败。
兼容\r\n和\n的解决方案
无需手动替换换行符,直接修改正则即可,提供两种实用方案:
方案1:在行尾允许可选的\r
在正则末尾的$前添加\r?,让行尾的回车符变为可选匹配项:
@"^([ \t]*Dependencies[\t ]*:[\t ]*)(([\\*?#\w.]+\.sql[\t ]*)+)\r?$"
这个修改最小,仅针对行尾的\r做兼容,不影响原有匹配逻辑。
方案2:扩大空白匹配范围
把正则中所有匹配空白的[\t ]*替换为[\t \r]*,让空白匹配规则包含回车符:
@"^([\t \r]*Dependencies[\t \r]*:[\t \r]*)(([\\*?#\w.]+\.sql[\t \r]*)+)$"
此方案更灵活,能处理行内任意位置出现的\r字符,适合复杂的空白场景。
注:你启用的IgnorePatternWhitespace选项仅会忽略正则表达式里的格式空白(比如正则编写时的换行或空格),不会影响字符类里的[\t \r]这类匹配规则,可放心使用。
内容的提问来源于stack exchange,提问作者Rachel Ambler
相关产品推荐
相关产品推荐

