[英]How do I split a string using a regular expression in Perl?
我在 Perl 中有一个字符串: 'CCCCCCCC^hC^iC^*C^"C^8A'
。
我想使用正则表达式拆分此字符串: "^[any_character]C"
。 换句话说,我想按实际字符^
分割它,然后是任何字符,然后是一个特定的字母(在这种情况下C
,但它可以是A
或任何其他字符)。
我试过查看其他问题/帖子,最后想出了我的@split_str = split(/\\^(\\.)C/, $letters)
,但这似乎不起作用。
我确定我做错了什么,但我不知道是什么。
你非常接近。 您的代码中只有几个错误。 在我解释它们之前,这是我用来测试解决方案的代码。
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Data::Dumper;
$_ = 'CCCCCCCC^hC^iC^*C^"C^8A';
my @data = split /\^(\.)C/;
say Dumper @data;
用你原来的正则表达式运行它,我们得到这个输出:
$VAR1 = 'CCCCCCCC^hC^iC^*C^"C^8A';
根本没有发生分裂。 那是因为您的正则表达式包含\\.
. 点匹配字符串中的任何字符,但通过使用反斜杠将其转义,您已告诉 Perl 将其视为普通点。 您的字符串中没有点,因此正则表达式不匹配且字符串未拆分。
如果我们删除反斜杠,我们会得到这个输出:
$VAR1 = 'CCCCCCCC';
$VAR2 = 'h';
$VAR3 = '';
$VAR4 = 'i';
$VAR5 = '';
$VAR6 = '*';
$VAR7 = '';
$VAR8 = '"';
$VAR9 = '^8A';
这个更好。 发生了一些分裂。 但是因为我们在点 ( (.)
) 周围有括号,所以 Perl 已经“捕获”了点匹配的字符并将它们添加到split()
返回的值列表中。
如果我们删除这些括号,我们只会得到分割标记之间的值。
$VAR1 = 'CCCCCCCC';
$VAR2 = '';
$VAR3 = '';
$VAR4 = '';
$VAR5 = '^8A';
请注意,我们得到了一些空元素。 那是因为在字符串中像 "^hC^iC" 这样的地方,两个相邻的分割标记之间没有数据。
通过在整个正则表达式( split /(\\^.C)/
)周围移动括号,我们可以获得一个列表,其中包括所有拆分标记以及它们之间的数据。
$VAR1 = 'CCCCCCCC';
$VAR2 = '^hC';
$VAR3 = '';
$VAR4 = '^iC';
$VAR5 = '';
$VAR6 = '^*C';
$VAR7 = '';
$VAR8 = '^"C';
$VAR9 = '^8A';
这些选项中的哪一个对您最有用取决于您要尝试做什么。
当你说[any_character] 时,你的意思是.
模式,点匹配除换行符以外的任何字符,如果您使用s
修饰符,它将匹配任何字符。
所以,在你的情况下,你不应该逃避点:
@split_str = split /\^.C/, $letters;
^
或者,使用s
修饰符:
@split_str = split /\^.C/s, $letters;
^
插入符号应该被转义以表示正则表达式模式中的文字插入符号。
有一个关于计数而不是拆分的问题。 for counting, and scalar return (the $_ contains the modified text):可以使用正则表达式替换和全局进行计数,以及标量返回($_ 包含修改后的文本):
my $text = 'CCCCCCCC^hC^iC^*C^"C^8C^9A^!B'; #litte longer than yours
$_ = $text ;
my $countanychar = s/\^.C//g ;
print "counting any char and C:\t $countanychar in $text\n";
$_ = $text ;
my $countnormalchar = s/\^\wC//g ; # h and i and 8 in this example avoid the * and "
print "counting normal char and C:\t $countnormalchar in $text\n";
$_ = $text ;
my $countnumber = s/\^\dC//g ;# the 8 in this example
print "counting number and C:\t $countnumber in $text\n";
$_ = $text ;
my $countextended = s/\^.\w//g ;# the he C and the A
print "counting extended C and A and B:\t $countextended in $text\n";
试试这样@split_str = split(/\\^/, $letters)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.