分隔符集之间的子串反之亦然

时间:2013-03-06 19:57:45

标签: regex perl

我使用带有一组分隔符的正则表达式来标记一本书。

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 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

或者您可能更喜欢:

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

答案 2 :(得分:0)

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

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

答案 3 :(得分: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);