我想从文件中的列中提取两个文件(向前或向后括号)。
每一行都有两个向前或两个反向括号:
C]chr2:29446394]
[chr1:154142875[A
我试过了:
@locus = split /\]/\[/, $string;
my $position = $locus[1];
我能够用前进或后退括号提取任一行
split /\[/, $string or split /\]/, $string
但是无法弄清楚如何编写一个可以同时使用这两个casses的语句。请提出建议。
由于
答案 0 :(得分:1)
我会使用分支重置模式,并捕获两个右方括号或两个左右方括号之间的所有内容
请注意,/x
修饰符允许我添加空格以使正则表达式更具可读性
use strict;
use warnings 'all';
my @columns = qw/ C]chr2:29446394] [chr1:154142875[A /;
for my $col ( @columns ) {
next unless $col =~ / (?|
\[ ([^[]*) \[
|
\] ([^]]*) \]
) /x;
my $val = $1;
print "$val\n";
}
chr2:29446394
chr1:154142875
答案 1 :(得分:0)
您可以使用此正则表达式匹配(不拆分)字符串:
(\[|\]).*?\1
(\[|\])
匹配[
或]
.*?
懒惰的正则表达式;匹配前一个标记之后的最小文本... \1
...直到首先出现的令牌([
或]
)答案 2 :(得分:0)
这将找到所有匹配的子串:
[
或]
[
或]
您要查找的值位于第二个括号中。您可以使用$2
内部变量来引用它:
while ($string =~ /([\[\]])([^\[\]]*)\1/g) {
#do something with $2
}
答案 3 :(得分:-1)
请尝试如下:
@locus = split /[\]\[]/, $string;
my $position = $locus[1];