使用perl中的正则表达式从一行中删除括号

时间:2014-10-31 22:31:02

标签: regex perl

我有一行看起来像这样:

(ABCD)(ABCDE)(ABCDEF)(ABCDEFG) 

但我希望像这样存储它:

ABCDABCDEABCDEFABCDEFG

在一个名为parser的变量中。我正在使用的代码是

my ($parser) = $subckt =~ m/\s*(\(.*?)\); 

这里$subckt变量用括号存储实际行。

如何在变量$parser中获取所需数据。 请帮忙。 谢谢

5 个答案:

答案 0 :(得分:2)

翻译运算符tr是您所需要的。使用/d(删除)修饰符,您可以删除列表中没有相应替换的所有字符。

如果你有Perl 5的14或更高版本,那么/r(非破坏性)修饰符会使它更加整洁。

该程序演示

use 5.014;

my $subckt = '(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)';
my $parser = $subckt =~ tr/()//dr;

print $parser;

<强>输出

ABCDABCDEABCDEFABCDEFG

答案 1 :(得分:2)

只需使用:

$subckt =~ s/[()]//g;

答案 2 :(得分:1)

如果您只想删除标题所示的括号, 替换运算符s///是自然选择:

my $subckt = '(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)';
my $parser = $subckt;
$parser =~ s/[()]//g; 

也就是说,要猜测你真正想要做什么以及你有什么样的可能输​​入是有点困难的。 基于帖子中破坏的正则表达式,也许你真正想要的是改变\s*\(X\)X的模式。如果是这种情况,那么使用与捕获组匹配的匹配将更容易,而不是替换,类似于您似乎尝试过的方式:

my $subckt = '(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)';
my ($parser) = join('', $subckt =~ m/\s*\((.*?)\)/g); 

这也适用于这样的输入:

my $subckt = '     (ABCD) (ABCDE)(ABCDEF)(ABCDEFG)';

这种方式有效:

  • m/...(...).../g返回(...)
  • 中捕获的匹配字符串列表
  • 您要匹配的内容是文字()中的内容,因此表达式实际上应该看起来像m/...\((...)\).../g,请注意\(和{{1}在\)捕获
  • 之外
  • (...)标志很重要(在您的标签中丢失),否则模式匹配将在第一场比赛后停止

答案 3 :(得分:1)

初始化新变量,然后删除所有非单词字符

( my $parser = $subckt ) =~ s/\W//g;

或使用/r Modifier

my $parser = $subckt =~ s/\W//gr;

答案 4 :(得分:0)

尝试替换g标志所有出现的括号

 $subckt =~ s/\(//g;
 $subckt =~ s/\)//g;