gpt4 book ai didi

regex - 围绕外部定界符拆分字符串,尊重字符组

转载 作者:行者123 更新时间:2023-12-04 06:07:13 26 4
gpt4 key购买 nike

假设我有一个字符串:

my $string = "foo{a},bar{b}, baz{c,d,e}";

使用一组分组字符来区分两个级别:

$grouping_characters = "{}"

我想围绕“外部”逗号 (,) 拆分此字符串,以尊重 $grouping_characters 中的所有内容。

对于上面的例子,输出应该是:

my @result = ("foo{a}", "bar{b}", "baz{c,d,e}")

我如何在 Perl 中执行此操作?

最佳答案

首先:如果你想正确解析某些编程语言或配置格式,你可能需要使用actual parser。 .

但是,您的任务可以使用正则表达式来完成。但是我们不会编写正则表达式来匹配我们想要拆分的逗号。相反,我们编写了一个匹配列表部分的正则表达式:

my $regex = qr/
\w+ # item can begin with some identifier
\{ [^\}]* \} # followed by some stuff in braces
[,;] # must end with comma or semicolon
/x;

然后我们可以像这样提取匹配项

my $string = "foo{a},bar{b}, baz{c,d,e};";
my @result = $string =~ /$regex/g;
dd @result; # using dd from Data::Dump

输出:

("foo{a},", "bar{b},", "baz{c,d,e};")

还不错。现在,我们以两种方式改进我们的正则表达式:

  1. 逗号不是匹配字符串的一部分
  2. 我们确保匹配相邻并且中间没有垃圾
  3. 我们以最简单的方式使分隔符可插入:我们将一些值插入到一个字符类中。

一起:

my $delims = quotemeta "{}";
my $regex = qr/
\w+
[$delims] [^$delims]* [$delims]
/x;

my $string = "foo{a},bar{b}, baz{c,d,e};";
my @result = $string =~ /\G ($regex) [,;] \s*/xg;
dd @result;

\G 断言锚定在上一个匹配项停止的地方。

输出:

("foo{a}", "bar{b}", "baz{c,d,e}")

太棒了。这可以通过两种方式进一步完善:

  1. 大括号里的东西是允许递归的
  2. 我们区分开盘和闭盘 delims,只允许正确的配对。事实上,foo}a{ 将是一个有效的项目......

如果不需要所有这些,当前的正则表达式应该没问题。

关于regex - 围绕外部定界符拆分字符串,尊重字符组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17936468/

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