假设我有变量
$x1 = 'XX a b XX c d XX';
$x2 = 'XX a b XX c d XX e f XX';
我想要一个正则表达式,它将找到XX之间的每个字母实例。我正在寻找一个通用的解决方案,因为我不知道有多少XX。
我尝试使用/XX(.*?)XX/g,但这只匹配x1的“ab”和x2的“ab”,“ef”,因为一旦找到第一个匹配项,引擎已经读取了第二个匹配项“XX”。
感谢您的帮助。
答案 0 :(得分:8)
尝试使用positive lookahead:
/XX(.*?)(?=XX)/
答案 1 :(得分:3)
答案 2 :(得分:3)
我建议拆分以及knittl。但您可能也想删除空格:
my @stuff = split /\s*XX\s*/, $line;
此外可以使用前瞻,但你真的不需要它们,因为你也可以使用相当复杂的替换:
非ws版本只是:
my @stuff = $line =~ m/XX((?:[^X]|X[^X])*)/g;
替换说,如果不是'X'
,你会采取任何措施 - 但如果没有其他'X'
,则会'X'
。将会有一个前瞻性角色,但它可以积极地消耗角色,而不会回溯。
修剪版本必须回溯以删除空格字符,因此表达式更加丑陋。
my @stuff = $line =~ m/XX\s*((?:[^X]|X[^X])*?(?:[^X\s]|X[^X]))/g;
答案 3 :(得分:0)
my $x2 = 'XX a b XX c d XX e f XX';
my @parts = grep { $_ ne '' } split /\s*XX\s*/, $x2;