我需要一个相当复杂的正则表达式,它将选择在它们之间有一个空格的单词,并且可以在其中包含“ - ”符号,但它不应该选择连续的空格。
'KENEDY JOHN G JR E' 'example' 'D-54'
我尝试过以下正则表达式:
\'([\s\w-]+)\'
但它选择了我不希望它做的连续空格。
我希望表达式选择
'KENEDY JOHN G JR E'
'example'
'D-54'
答案 0 :(得分:3)
也许,
\'([\w-]+(?:\s[\w-]+)*)\'
修改强>
如果不允许使用前导/尾随破折号(在单词边界上),则应显示为:
/\'(\w+(?:[\s-]\w+)*)\'/
答案 1 :(得分:1)
这样的表达应该这样做:
'[\w-]+(?:\s[\w-]+)*'
答案 2 :(得分:1)
试试这个:
my $data = "'KENEDY JOHN G JR E' 'example' 'D-54'";
# Sets of
# one or more word characters or dash
# followed by an optional space
# enclosed in single quotes
#
# The outermost ()s are optional. There just
# so i can print the match easily as $1.
while ($data =~ /(\'([\w-]+\s?)+\')/g)
{
print $1, "\n";
}
输出
'KENEDY JOHN G JR E'
'example'
'D-54'
答案 3 :(得分:1)
不确定这是否适用于您,因为您专门要求使用正则表达式。但是,如果您希望字符串由两个或更多空格或短划线分隔,则可以使用split
use strict;
use warnings;
use v5.10;
my $str = q('KENEDY JOHN G JR E' 'example' 'D-54');
my @match = split /\s{2,}/, $str;
say for @match;
具有类似功能的正则表达式
my @match = $str =~ /(.*?)(?:\s{2,}|$)/g;
请注意,您需要找到行尾$
的边缘情况。
使用split
或通配符.
的好处是您依靠空格来定义字段,而不是字段本身的内容。
答案 4 :(得分:0)
您的代码实际上是按原样运行。
use feature qw( say );
$_ = "'KENEDY JOHN G JR E' 'example' 'D-54'";
say for /\'([\s\w-]+)\'/g;
输出:
KENEDY JOHN G JR E
example
D-54
(如果你也想要引号,请移动parens。)
我只想使用
my @data = /'([^']*)'/g;
如果您要进行任何验证,请在之后进行验证。