Perl 5 - regex交替不返回第一个匹配项[重复]

tpgth1q7  于 2023-03-03  发布在  Perl
关注(0)|答案(1)|浏览(177)
    • 此问题在此处已有答案**:

(9个答案)
4天前关闭。
我正在尝试将汽车信息文本解析为分号分隔的文件。字段应该是年份、制造商、型号、密钥卡描述、FCC ID。正则表达式交替应该能够将型号与密钥卡描述分隔开。我以为交替将使用第一个匹配项,但总是在选择时选择单词Remote,不管它在交替中的位置如何。为什么?我怎样才能让它选择Smart而不是Remote作为组的开始。我正在解析的文本文件:

2013 Chevrolet Tahoe Keyless Entry Remote Key Fob 6B w/ Hatch, Rear Glass, Remote Start (FCC: OUC60270 / OUC60221, P/N: 15913427)
2021 Jeep Grand Cherokee Smart Remote Key Fob 3B (FCC: M3N-40821302, P/N: 68143502AA)
2010 Acura TL Smart Remote Key Fob 4B w/ Trunk (FCC: M3N5WY8145, P/N: 72147-TK4-A71)
2006 Mazda 5 Remote Flip Key Fob 3B (FCC: BGBX1T478SKE125-01, P/N: CC43-67-5RYC)

正则表达式:

if( $row =~ /^(\d+)\s(\w+)\s(\w.*)\s(Smart|Keyless|KEYLESS|Remote)(\s\w+.*)\s\(FCC\:\s(.+)\,\s.+/ ){ print "$1;$2;$3;$4$5;$6\n" };

其结果是,它在交替中一直选择Remote作为最佳选项:

2017;Chevrolet;Cruze;Remote Flip Key Fob 4B w/ Trunk;LXP-T004 (XL8 Model)
2013;Chevrolet;Tahoe Keyless Entry Remote Key Fob 6B w/ Hatch, Rear Glass,;Remote Start;OUC60270 / OUC60221
2021;Jeep;Grand Cherokee Smart;Remote Key Fob 3B;M3N-40821302
2010;Acura;TL Smart;Remote Key Fob 4B w/ Trunk;M3N5WY8145
2006;Mazda;5;Remote Flip Key Fob 3B;BGBX1T478SKE125-01

正则表达式选择Remote而不是Smart是因为它更长并且有多个匹配项吗?当一行中有多个匹配项时,我如何让它选择第一个匹配项而不是最长的匹配项?
我试过重新排列交替中的单词,但它总是选择Remote

6jjcrrmo

6jjcrrmo1#

.*尝试匹配尽可能长的子字符串。使用?字符将其更改为匹配最少的字符数:

/^(\d+)\s(\w+)\s(\w.*?)\s(Smart|Keyless|KEYLESS|Remote)(\s\w+.*)\s\(FCC\:\s(.+)\,\s.+/
#                    ~

相关问题