正则表达式除非用引号或括号括起来

时间:2014-03-07 20:29:11

标签: regex perl

如何使用Regex

拆分以下内容
words and [other word] combined with "words in quotes"

输出应拆分为:

words
and
other word
combined
with
words in quotes

谢谢!

(答案不一定是perl,但一般的正则表达格式都没问题。)

4 个答案:

答案 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])|(?<=\[)(.*)(?=\])|(?<=")(.*)(?=")