Perl正则表达式问题

kcugc4gi  于 2022-11-15  发布在  Perl
关注(0)|答案(4)|浏览(252)

假设我有变量

$x1 = 'XX a b XX c d XX';
$x2 = 'XX a b XX c d XX e f XX';

我需要一个正则表达式,它可以找到XX之间的每个字母示例。我正在寻找一个通用的解决方案,因为我不知道有多少个XX。
我尝试使用/XX(.*?)XX/g,但这只匹配“a b”表示x1,“a b”、“e f”表示x2,因为一旦找到第一个匹配项,引擎就已经读取了第二个“XX”。
谢谢你的帮助。

7y4bm7vi

7y4bm7vi2#

我建议使用split和knittl。但是您可能也想删除空格:

my @stuff = split /\s*XX\s*/, $line;

你也可以使用lookaheads,但你真的不需要它们,因为你也可以使用相当复杂的替换:
非WS版本将仅为:

my @stuff = $line =~ m/XX((?:[^X]|X[^X])*)/g;

交替表示,如果不是'X',你可以选择任何字符,但是如果'X'后面没有'X',你可以选择'X'
修剪版本将不得不回溯以去除空格字符,因此表达式更丑陋。

my @stuff = $line =~ m/XX\s*((?:[^X]|X[^X])*?(?:[^X\s]|X[^X]))/g;
lmyy7pcs

lmyy7pcs3#

您可以使用split

@stuff_between_xx = split /XX/, $x1;

要在标量变量中存储匹配数:

$stuff_between_xx = split /XX/, $x1;
yhived7q

yhived7q4#

my $x2 = 'XX a b XX c d XX e f XX';

my @parts = grep { $_ ne '' } split /\s*XX\s*/, $x2;

相关问题