gpt4 book ai didi

regex - 我怎样才能捕获一个逃脱的“而不是一个未逃脱的?

转载 作者:行者123 更新时间:2023-12-02 06:25:03 26 4
gpt4 key购买 nike

假设正则表达式需要捕获的部分在下面的字符串中用PORTION表示

,"PORTION","","a",["some_string"]  

部分的例子是

  • \"abc123
  • abc123\"
  • \"abc123\"
  • abc\"123\"
  • abc123

所以字符串实际上看起来像

  • ,"\"abc123","","a",["some_string"]
  • ,"abc123\"","","a",["some_string"]
  • "\"abc123\"","","a",["some_string"]
  • "abc\"123\"","","a",["some_string"]
  • "abc123","","a",["some_string"]

PORTION 用双引号括起来。 PORTION 中的双引号由反斜杠转义。我目前的模式是

my $pattern = '(.?([\\"]|[^"][^,][^"])*)';

上面例子的结果如下

  • \"abc123","","a"
  • abc123
  • \"abc12
  • abc\"123\""
  • abc123"

该模式尝试匹配序列前面不是“,”的所有内容
并且还允许捕获\"
但它没有按预期工作。我怎样才能让它发挥作用?

最佳答案

你把事情搞得太复杂了;没有规则说你必须在一个单一的正则表达式中完成所有的解析。由于您的字符串看起来像一个逗号分隔的序列,因此首先要这样解析它:

my @fields = split /(?<!\\),/, $string;   # use comma as a delimiter (except when escaped)

...然后相应地解析您的第一个字段:

shift @fields unless $fields[0];     # pull off the potentially null first field
$fields[0] =~ s/^"//g; # remove the leading "
$fields[0] =~ s/(?<!\\)"$//g; # remove the trailing " that isn't preceded by a \

您可以通过将上述代码包装在 for 循环或 map() 中,以这种方式解析所有字段。

请注意,此代码不考虑诸如 \\, 之类的情况(逗号在这里是有效的分隔符,即使它会错误地通过正则表达式)。因此,最好为您的格式(无论它是什么)使用合适的解析器。你可能想看看 Text::CSV .

关于regex - 我怎样才能捕获一个逃脱的“而不是一个未逃脱的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2175022/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com