用于选择单个间隔短语但不是空格的正则表达式

时间:2012-06-04 14:38:51

标签: regex perl

我需要一个相当复杂的正则表达式,它将选择在它们之间有一个空格的单词,并且可以在其中包含“ - ”符号,但它不应该选择连续的空格。

'KENEDY JOHN G JR E'                  'example'                 'D-54'

我尝试过以下正则表达式:

\'([\s\w-]+)\'

但它选择了我不希望它做的连续空格。

我希望表达式选择

'KENEDY JOHN G JR E'
'example'
'D-54'

5 个答案:

答案 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;

如果您要进行任何验证,请在之后进行验证。