asi*_*mov 2 perl whitespace split lookbehind
我试图在 perl 中的元素之间的空格上分割一个字符串。但是,每个元素也可能包含空格(通过双引号或括号括起来)。
例如,一个字符串包含:
for element in hydrogen helium "carbon 14" $(some stuff "here") FILE
Run Code Online (Sandbox Code Playgroud)
我想最终得到一个像 (hydrogen, helium, "carbon 14", "$(some stuff "here")", FILE)
我可以处理这个for element in位并将其余的作为一个字符串。我试过做
@elements = split /(?<=\"[^\"]*\")\s+(?=\"[^\"]*\")/, $list
Run Code Online (Sandbox Code Playgroud)
虽然正则表达式只匹配引号之间的空格(在 regexr.com 上检查),但 perl 程序给了我Lookbehind longer than 255 not implemented in regex.
是否有更好的使用split空白的方法可以考虑到这一点?我的正则表达式做错了什么?
匹配带引号或带括号的表达式,然后与非空格序列交替
my @elems = $string =~ / ( "[^"]+" | \S*\( [^)]+ \)\S* | \S+ ) /gx;
Run Code Online (Sandbox Code Playgroud)
用您的字符串和一些简单的变体进行了测试。
这假设两个分隔符都没有嵌套:连续引号之间的表达式作为一个元素作为一个整体(即使它有括号子表达式),括号内的表达式也是如此(即使它有引号段)。这是从问题中推断出来的。
我已经允许括号前后的非空格字符序列,以适应$前面的内容。调整一下,如果它确实只能在前面一美元。