8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在 Perl 中解析 C 字符串时 `s/'((?:[^']|\')*)'//` 有什么问题?

Farbod Ahmadian 2月前

88 0

我似乎无所事事,因为我无法找出正则表达式的错误所在:我试图解析一个包含一行字符串的 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 等价的吗?

帖子版权声明 1、本帖标题:在 Perl 中解析 C 字符串时 `s/'((?:[^']|\')*)'//` 有什么问题?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Farbod Ahmadian在本站《string》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 当我在写问题时找到了答案时,我本可以取消提问,但由于我认为这也可能引起其他人的兴趣,所以我将在这里提供我的答案:

    来自 man perlre(1):

    备选方案从左到右进行尝试,因此第一个找到的整个表达式匹配的备选方案就是被选中的备选方案。这意味着备选方案不一定是贪婪的。例如:当将 \'foo|foot\' 与 \'barefoot\' 进行匹配时,只有 \'foo\' 部分会匹配,因为这是第一个尝试的备选方案,并且它成功匹配目标字符串。(这似乎并不重要,但当您使用括号捕获匹配的文本时,这很重要。)

    所以实际上是的,替代方案的顺序很重要。

返回
作者最近主题: