2013-03-06 40 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); 
}