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|,

但是什么样的正则表达式只会将 $a 中的分隔符返回到标量或列表?

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

任何尽可能简单地做到这一点的提示将不胜感激。

4

4 回答 4

0

在否定字符类上拆分[^...]

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

或者使用带有/g(global) 修饰符的正则表达式

my @b = /[ ?&".,;\/]/g;
于 2013-03-06T19:59:40.987 回答
0
# ' ', '?', '&', '"', ...
my @seps = $a =~ /([ ?&".,;\/])/g;

或者你可能更喜欢:

# 'A', ' ', 'B', '?', 'C', ...
my @both = split /([ ?&".,;\/])/, $a;
于 2013-03-06T19:59:56.053 回答
0

另一种不使用单行正则表达式的方法。

my @delimiters = ();
while($a =~ /([ ?&\"\.\,\;\/])/g) {
  push(@delimiters, $1);
}
于 2013-03-06T20:10:12.273 回答
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);
于 2013-03-06T22:10:13.113 回答