如何在Perl中使用正则表达式拆分字符串?

use*_*576 3 regex string perl

我在Perl中有一个字符串:'CCCCCCCC^hC^iC^*C^"C^8A'.

我想使用正则表达式拆分此字符串:"^[any_character]C".换句话说,我想用实际字符分隔它^,然后是任何字符,后跟一个特定的字母(在这种情况下C,但它可以是A,或任何其他字符).

我试过看其他问题/帖子,最后提出了我的问题@split_str = split(/\^(\.)C/, $letters),但这似乎没有用.

我确定我做错了什么,但我不知道是什么.

Dav*_*oss 6

你非常接近.您的代码中只有几个错误.在我解释之前,这是我用来测试解决方案的代码.

#!/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;
Run Code Online (Sandbox Code Playgroud)

使用原始正则表达式运行此命令,我们得到此输出:

$VAR1 = 'CCCCCCCC^hC^iC^*C^"C^8A';
Run Code Online (Sandbox Code Playgroud)

根本没有发生分裂.那是因为你的正则表达式包括\..该点匹配字符串中的任何字符,但通过使用反斜杠转义它,您告诉Perl将其视为普通点.字符串中没有点,因此正则表达式不匹配,字符串不会被拆分.

如果我们删除反斜杠,我们得到这个输出:

$VAR1 = 'CCCCCCCC';
$VAR2 = 'h';
$VAR3 = '';
$VAR4 = 'i';
$VAR5 = '';
$VAR6 = '*';
$VAR7 = '';
$VAR8 = '"';
$VAR9 = '^8A';
Run Code Online (Sandbox Code Playgroud)

这个更好.发生了一些分裂.但是因为我们在dot((.))周围有括号,所以Perl"捕获"了点匹配的字符并将它们添加到split()返回的值列表中.

如果我们删除这些括号,我们只得到分割标记之间的值.

$VAR1 = 'CCCCCCCC';
$VAR2 = '';
$VAR3 = '';
$VAR4 = '';
$VAR5 = '^8A';
Run Code Online (Sandbox Code Playgroud)

请注意,我们得到一些空元素.那是因为在字符串中的"^ hC ^ iC"这样的地方,两个相邻的分割标记之间没有数据.

通过围绕整个正则表达式(split /(\^.C)/)移动括号,我们可以得到一个列表,其中包括所有拆分标记以及它们之间的数据.

$VAR1 = 'CCCCCCCC';
$VAR2 = '^hC';
$VAR3 = '';
$VAR4 = '^iC';
$VAR5 = '';
$VAR6 = '^*C';
$VAR7 = '';
$VAR8 = '^"C';
$VAR9 = '^8A';
Run Code Online (Sandbox Code Playgroud)

哪些选项对您最有用取决于您正在尝试做什么.

  • 谢谢大家的有益评论.我今天真的学到了一些东西 (2认同)

Wik*_*żew 5

当你说[any_character]时,你必须指的是.模式,一个点匹配任何字符而不是换行符号,如果使用s修饰符,它将匹配任何字符.

所以,在你的情况下,你不应该逃避点:

@split_str = split /\^.C/, $letters;
                      ^
Run Code Online (Sandbox Code Playgroud)

或者,使用s修饰符:

@split_str = split /\^.C/s, $letters;
                         ^
Run Code Online (Sandbox Code Playgroud)

应该转义插入符以表示正则表达式中的字面插入符号.