假设我有变量
$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”。谢谢你的帮助。
zu0ti5jz1#
尝试使用positive lookahead:
/XX(.*?)(?=XX)/
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'。修剪版本将不得不回溯以去除空格字符,因此表达式更丑陋。
'X'
my @stuff = $line =~ m/XX\s*((?:[^X]|X[^X])*?(?:[^X\s]|X[^X]))/g;
lmyy7pcs3#
您可以使用split
split
@stuff_between_xx = split /XX/, $x1;
要在标量变量中存储匹配数:
$stuff_between_xx = split /XX/, $x1;
yhived7q4#
my $x2 = 'XX a b XX c d XX e f XX'; my @parts = grep { $_ ne '' } split /\s*XX\s*/, $x2;
4条答案
按热度按时间zu0ti5jz1#
尝试使用positive lookahead:
7y4bm7vi2#
我建议使用split和knittl。但是您可能也想删除空格:
你也可以使用lookaheads,但你真的不需要它们,因为你也可以使用相当复杂的替换:
非WS版本将仅为:
交替表示,如果不是
'X'
,你可以选择任何字符,但是如果'X'
后面没有'X'
,你可以选择'X'
。修剪版本将不得不回溯以去除空格字符,因此表达式更丑陋。
lmyy7pcs3#
您可以使用
split
要在标量变量中存储匹配数:
yhived7q4#