2012-06-04 35 views
3

我需要一個相當複雜的正則表達式來選擇單詞之間有一個空格的單詞,並且可以在其中包含' - '符號,但它不應該選擇連續的空格。選擇單個空格而不是空格的正則表達式

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

我曾嘗試以下的正則表達式:

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

,但它選擇連續空白,我不希望它做的。

我想表達的選擇

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

「比較複雜」? [我認爲不是](http://www.catonmat.net/blog/perl-regex-that-matches-prime-numbers/)。 – kevlar1818

回答

3

也許,

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

編輯

如果前/後破折號(在字邊界)是不允許的,這應該閱讀:

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

像這樣的表達應該這樣做:

'[\w-]+(?:\s[\w-]+)*' 
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' 
+0

哎呀!對不起,你想要一個相當複雜的正則表達式。這對你來說可能太簡單了! :-) – theglauber

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或通配符.的好處是您依賴空白來定義您的字段,而不是字段本身的內容。

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 

(如果你想的報價太移動括號。)

我會簡單地使用

my @data = /'([^']*)'/g; 

如果您有任何驗證辦,之後再做。