如何正确拆分包含向前或向后括号的列

时间:2016-07-23 15:12:47

标签: regex perl

我想从文件中的列中提取两个文件(向前或向后括号)。

每一行都有两个向前或两个反向括号:

C]chr2:29446394]
[chr1:154142875[A

我试过了:

@locus = split /\]/\[/, $string;
my $position = $locus[1];

我能够用前进或后退括号提取任一行 split /\[/, $string or split /\]/, $string但是无法弄清楚如何编写一个可以同时使用这两个casses的语句。请提出建议。

由于

4 个答案:

答案 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)

这将找到所有匹配的子串:

  • []
  • 开始
  • 在下一个[]
  • 之前包含0-N个符号

您要查找的值位于第二个括号中。您可以使用$2内部变量来引用它:

while ($string =~ /([\[\]])([^\[\]]*)\1/g) {
    #do something with $2
}

答案 3 :(得分:-1)

请尝试如下:

@locus = split /[\]\[]/, $string;
my $position = $locus[1];