2013-03-06 80 views
0

我使用帶有一組分隔符的正則表達式來標記一本書。分隔符集之間的子串反之亦然

my $a='A B?C&D"E.F"G,H;I;J/K/L?M:N'; 
print $a."\n"; 
my @b=split(/[ ?&".,;\/]/ , $a); 
foreach (@b) { print"|".$_."|,"; } print"\n"; 

此已經工作:

A B?C&D"E.F"G,H;I;J/K/L?M:N 
|A|,|B|,|C|,|D|,|E|,|F|,|G|,|H|,|I|,|J|,|K|,|L|,|M:N|, 

但是,什麼樣的正則表達式只會從$一個分隔符返回一個標量或列表?

my $c = $a =~ REGEXP_I_AM_LOOKING_FOR --> ' ?&".",;;//?' 

任何暗示要做到這一點儘可能簡單將不勝感激。

+0

「得到的只是一個字符串中看到的分隔符? &".",;; // ?:'ov課程必須是'? &".",;; //?' – bootware 2013-03-06 20:02:29

+0

謝謝你到目前爲止。 我寧願使用否定類。 但我得到了 ||,| |,| | | | | | |,|「| |,|。|,|」|,|,|,| | | | | | | |/|,|/|,|?|, $ c [0]是錯誤的:-( 其他:是否有可能把分隔符保持爲標量並使用正規表達式中的標量? – bootware 2013-03-06 20:22:52

回答

0

將分隔符保存在一個字符串中。

my $input = 'A B?C&D"E.F"G,H;I;J/K/L?M:N'; 
my $delimiters = ' ?&".",;;//?'; 

my @found_fields = split(/[$delimiters]/, $input); 
print "|$_|," foreach (@found_fields); 

現在,您可以通過使用一個否定的字符類,這僅僅是這個[^...]

my @found_delimiters = split(/[^$delimiters]/, $input); 
print "|$_|," foreach (@found_delimiters); 
0

在否定字符類上分割[^...]

my @b=split(/[^ ?&".,;\/]/ , $a); 

或者使用正則表達式與/g(全球)修改

my @b = /[ ?&".,;\/]/g; 
+0

也可以通過將分隔符保持爲標量來做到這一點嗎? – bootware 2013-03-06 20:04:37

0
# ' ', '?', '&', '"', ... 
my @seps = $a =~ /([ ?&".,;\/])/g; 

或者你更願意有:

# 'A', ' ', 'B', '?', 'C', ... 
my @both = split /([ ?&".,;\/])/, $a; 
0

另一種方法,而無需使用一個-liner正則表達式。

my @delimiters =(); 
while($a =~ /([ ?&\"\.\,\;\/])/g) { 
    push(@delimiters, $1); 
}