我似乎无所事事,因为我无法找出正则表达式的错误所在:我试图解析一个包含一行字符串的 C 源文件(实际上这些字符串是
我似乎坐在我的眼睛上,因为我无法找出我的正则表达式有什么问题:
我正在尝试解析包含一行内的字符串的 C 源文件(实际上这些字符串是正则表达式,但这并不重要)。基本上 /"([^"]*)"/
应该捕获字符串(不带引号),除非其中有双引号。
我也可以使用字符串中的双引号匹配 /(\\"*)/!
,但是我无法组合两个正则表达式:
使用 /"((?:[^"]|\\")*)"/
(捕获双引号之间的文本直到第一个非转义的双引号)捕获在第一个之后结束 "
,如本示例调试器会话所示:
DB<15> $x='"SAMSUNG SSD SM841N? (2\\.5\"? 7mm |mSATA )?(128|256|512)GB( SED)?|"'
DB<16> x $x =~ s/"((?:[^"]|\\")*)"//
0 1
DB<17> x $x
0 '? 7mm |mSATA )?(128|256|512)GB( SED)?|"'
DB<18>
在写这个问题的时候,我尝试交换两个替代方案,突然它就起作用了:
DB<18> $x='"SAMSUNG SSD SM841N? (2\\.5\"? 7mm |mSATA )?(128|256|512)GB( SED)?|"'
DB<19> x $x =~ s/"((?:\\"|[^"])*)"//
0 1
DB<20> x $x
0 ''
DB<21>
那么正则表达式 A|B
和 B|A
等价的吗?