如何使用Regex
拆分以下内容words and [other word] combined with "words in quotes"
输出应拆分为:
words
and
other word
combined
with
words in quotes
谢谢!
(答案不一定是perl,但一般的正则表达格式都没问题。)
答案 0 :(得分:2)
你可以这样做:
$string = 'words and [other word] combined with "words in quotes"';
while($string =~ /(?|\[([^]]*)]|"([^"]*)"|(\w+))/g) {
print $1 . "\n";
}
我使用branch reset功能(?|...|...|...)
为三个捕获组提供相同的数字。
答案 1 :(得分:1)
这就是我想出的:
my $str = 'words and [other word] combined with "words in quotes"';
my @arr = $str =~ /"([^"]*)"|\[([^\]]*)\]|(\S+)/g;
## removing undefined and empty things from array
@arr = grep { defined } @arr;
## printing array
$\ = $/;
print for @arr;
答案 2 :(得分:0)
你问的不简单,我希望你回答了我的问题。
鉴于信息非常有限,我猜这是你想要的。
它相对复杂,并且使用了自Perl 5版本10以来才可用的交替重置模式。
我编写了一个解决方案,删除任何平衡括号和双引号,但保留所有空格。如果任何左括号或引号与结束分隔符不匹配,则不再处理该字符串。
use strict;
use warnings;
use 5.010;
my $s = 'words and [other word] combined with "words in quotes"';
my @tokens;
while ( $s =~ / \G (?| \[ ( [^\[\]]* ) \] | " ( [^"]* ) " | ( [^\[\]"]+ ) ) /gx ) {
print "«$1»\n";
}
<强>输出强>
«words and »
«other word»
« combined with »
«words in quotes»
答案 3 :(得分:0)
这有点冗长,但相当清楚:
^[a-zA-Z]*\w|(?<=([\b\s]))[a-z]*(?=[\b\s])|(?<=\[)(.*)(?=\])|(?<=")(.*)(?=")