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 $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 に答える
0

ワンライナー正規表現を使用しない別のアプローチ。

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