在仍然启用m标志时忽略特定的\ n字符

时间:2018-04-26 22:24:45

标签: ruby regex

我希望跨多行匹配字符,所以我启用了m标志。但是,我不想匹配特定的\ n。相反,我想只匹配一个空格。但似乎新行也匹配空格:

 " 41\n6332 Hardin Rd, Bensalem, PA\n 19020" =~ /\s(\d+\s.+,.+,.+\d+)/m
 => 0 

" 41\n6332 Hardin Rd, Bensalem, PA\n 19020" =~ /\s(\d+[ ].+,.+,.+\d+)/m
 => 3 

即使我尝试明确忽略换行符:

" 41\n6332 Hardin Rd, Bensalem, PA\n 19020" =~ /\s(\d+[^\n].+,.+,.+\d+)/m
 => 0 

为什么换行符与空格字符匹配?我该怎么做才能确保它不会在其他地方的多行中匹配并仍然匹配?

1 个答案:

答案 0 :(得分:0)

/\s(\d+[^\n].+,.+,.+\d+)/m模式与" 41\n6332 Hardin Rd, Bensalem, PA\n 19020"匹配,因为当匹配[^\n]41回溯发生后正则表达式引擎到达\d+时:正则表达式引擎尝试匹配字符串不同,因为遇到\n,下一个字符应该是不同的字符。因此,它返回\d+并匹配4,而1不是换行符,因此匹配仍在继续。

您可以将搜索锚定在字符串的开头,并使用占有量词来阻止回溯,同时使用前瞻实施否定检查:

/\A\s*(\d++(?!\n).+,.+,.+\d)/m

请参阅regex demo

<强>详情

  • \A - 字符串开头
  • \s* - 0+ whitespaces
  • (\d++(?!\n).+,.+,.+\d) - 捕获第1组:
    • \d++(?!\n) - 1+位数(与++量词匹配占有率)未跟随换行符(如(?!\n)为负前瞻,如果有新换行符,则会导致匹配失败当前位置的权利)
    • .+,.+, - 尽可能多地出现2个字符,然后是,
    • .+\d - 尽可能多的1个字符后跟数字。