【问题标题】:How to parse single-quoted string with nested quote-operator in perl?如何在 perl 中使用嵌套的引号运算符解析单引号字符串?
【发布时间】:2015-08-14 11:47:34
【问题描述】:

我有以下字符串:

my $str = 'ab cd q{ef gh '\"} ij';

我想将字符串拆分为:

$VAR1 = ['ab', 'cd', 'q{ef gh '\"}', 'ij']; 

我已经使用了 parse_line() 来解析它:

my @arr = parse_line('\s+', 1, $str);

但是,由于输入字符串中的单引号没有转义,并且 parse_line() 无法解释 q() 运算符,所以我得到一个空数组作为输出。

确切地说,我想将引用字符串视为一个单词,而不管其内容如何。我能想到的唯一解决方案是编写一个可以解释引用的自定义函数-操作员。有什么简单的方法可以实现吗?

谢谢!

【问题讨论】:

  • 我认为你放错了反斜杠ab cd q{ef gh \'"} ij'

标签: regex perl parsing split


【解决方案1】:
\s+(?![^{]*})

您可以按此拆分。查看演示。

https://regex101.com/r/uF4oY4/33

如果你嵌套了{},你可以使用它。

{(?:[^{}]*|(?R))*}\K|\s

查看演示。

https://regex101.com/r/uF4oY4/34

【讨论】:

  • 太棒了,先生。我试图自己解决这个问题。好答案!
  • 请注意,q 运算符 1) 允许对分隔符和 \ 进行转义,2) 允许使用各种分隔符,以及 3) 允许在 q 和分隔符之间使用空格。但尚不清楚这些是否应支持。
  • 我的意思是q {foo} 和q{foo} 是等价的。 q!foo! 也是如此。至少在 Perl 中。目前尚不清楚 OP 是否愿意支持这一点。
  • @ikegami 是的,我想支持所有这样的组合。简而言之,我想将引用字符串视为一个单词,而不管其内容如何。
  • @ikegami 你能链接一个 perl 的文档,其中解释了允许使用哪些分隔符吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 2022-01-19
相关资源
最近更新 更多