3

間にスペースが 1 つある単語を選択し、単語に「-」記号を含めることができるかなり複雑な正規表現が必要ですが、連続した空白を選択するべきではありません。

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

次の正規表現を試しました。

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

しかし、それは私がしたくない連続した空白を選択します。

式を選択したい

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

5 に答える 5

3

多分、

\'([\w-]+(?:\s[\w-]+)*)\'

?

編集

先頭/末尾のダッシュ (単語境界上) が許可されていない場合は、次のようになります。

/\'(\w+(?:[\s-]\w+)*)\'/
于 2012-06-04T14:42:45.000 に答える
1

特に正規表現を要求したため、これが当てはまるかどうかはわかりません。ただし、2つ以上の空白またはダッシュで区切られた文字列が必要な場合は、次を使用できます。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またはワイルドカードを使用する利点は.、フィールド自体のコンテンツではなく、空白を使用してフィールドを定義できることです。

于 2012-06-04T15:24:50.793 に答える
1

次のような式でそれを行う必要があります。

'[\w-]+(?:\s[\w-]+)*'
于 2012-06-04T14:44:11.637 に答える
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'
于 2012-06-04T14:51:38.377 に答える
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;

実行する検証がある場合は、後で実行します。

于 2012-06-04T15:28:06.337 に答える