我希望跨多行匹配字符,所以我启用了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
为什么换行符与空格字符匹配?我该怎么做才能确保它不会在其他地方的多行中匹配并仍然匹配?
答案 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个字符后跟数字。