在perl中使用regex从行中删除括号
我有一行,看起来像这样:在perl中使用regex从行中删除括号,regex,perl,Regex,Perl,我有一行,看起来像这样: (ABCD)(ABCDE)(ABCDEF)(ABCDEFG) my $subckt = ' (ABCD) (ABCDE)(ABCDEF)(ABCDEFG)'; 但我想这样存储它: ABCDABCDEABCDEFABCDEFG 在一个名为parser的变量中。我使用的代码是 my ($parser) = $subckt =~ m/\s*(\(.*?)\); 此处$subckt变量用括号存储实际行 如何在变量$parser中获取所需的数据。 请帮忙。 如
(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)
my $subckt = ' (ABCD) (ABCDE)(ABCDEF)(ABCDEFG)';
但我想这样存储它:
ABCDABCDEABCDEFABCDEFG
在一个名为parser的变量中。我使用的代码是
my ($parser) = $subckt =~ m/\s*(\(.*?)\);
此处$subckt
变量用括号存储实际行
如何在变量$parser
中获取所需的数据。
请帮忙。
如果您只想删除标题中的括号,请多谢, 替换运算符
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);
这也适用于以下输入:
(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)
my $subckt = ' (ABCD) (ABCDE)(ABCDEF)(ABCDEFG)';
其工作方式:
返回在m/…(…)…/g
(…)
- 您想要匹配的是literal
和(
中的内容,因此表达式实际上应该看起来像)
,请注意m/…\(…)…)…/g
和(
捕获之外的\)
(…)
标志很重要(您的中缺少),否则模式匹配将在第一次匹配后停止/g
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);
这也适用于以下输入:
(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)
my $subckt = ' (ABCD) (ABCDE)(ABCDEF)(ABCDEFG)';
其工作方式:
返回在m/…(…)…/g
(…)
- 您想要匹配的是literal
和(
中的内容,因此表达式实际上应该看起来像)
,请注意m/…\(…)…)…/g
和(
捕获之外的\)
(…)
标志很重要(您的中缺少),否则模式匹配将在第一次匹配后停止/g
$subckt =~ s/\(//g;
$subckt =~ s/\)//g;
尝试替换括号中的所有事件,g标志会这样做
$subckt =~ s/\(//g;
$subckt =~ s/\)//g;
初始化新变量,然后删除所有非单词字符
( my $parser = $subckt ) =~ s/\W//g;
或使用:
初始化新变量,然后删除所有非单词字符
( my $parser = $subckt ) =~ s/\W//g;
或使用:
translate操作符就是您所需要的。使用/d
(删除)修饰符,可以删除列表中没有相应替换项的所有字符
如果您有14版或更高版本的Perl 5,那么/r
(非破坏性)修饰符会使它更整洁
本程序演示
use 5.014;
my $subckt = '(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)';
my $parser = $subckt =~ tr/()//dr;
print $parser;
输出
ABCDABCDEABCDEFABCDEFG
translate操作符就是您所需要的。使用/d
(删除)修饰符,可以删除列表中没有相应替换项的所有字符
如果您有14版或更高版本的Perl 5,那么/r
(非破坏性)修饰符会使它更整洁
本程序演示
use 5.014;
my $subckt = '(ABCD)(ABCDE)(ABCDEF)(ABCDEFG)';
my $parser = $subckt =~ tr/()//dr;
print $parser;
输出
ABCDABCDEABCDEFABCDEFG
只需使用:
$subckt =~ s/[()]//g;
只需使用:
$subckt =~ s/[()]//g;
这可能是一个必然的结论,但选民是否愿意发表评论?要求删除括号,而不是所有非单词字符。此解决方案可能适用于示例数据,但可能会删除用户希望保留的其他字符。@KimRyan鉴于OP主要在努力解决如何使用匹配运算符的问题,因此,将其主要用于如何使用替换运算符创建原始变量的修改版本似乎是合理的。尽管如此,我同意如果他们的真实数据与样本数据相差很大,解决方案将需要微调。这可能是一个必然的结论,但选民是否愿意发表评论?要求是删除括号,而不是所有非单词字符。此解决方案可能适用于示例数据,但可能会删除用户希望保留的其他字符。@KimRyan鉴于OP主要在努力解决如何使用匹配运算符的问题,因此,将其主要用于如何使用替换运算符创建原始变量的修改版本似乎是合理的。尽管如此,我同意如果他们的实际数据与样本数据相差很大,解决方案将需要微调。进行向下投票的一个原因是:如果行中不包含括号,则这不起作用。如果括号不平衡,则不起作用。它有一个随机匹配的空格
\s*
,它什么都不做。它之所以能工作,是因为您只使用了一组特定的输入。同样的事情的更好版本是使用regex/[^()]+/g
。但即使如此,它也不如像博罗丁所建议的那样用tr
删除()
。此外,它还可能导致错误的结果,例如ABC(D
将返回ABC
,而不是ABCD
@TLP OP拥有\s*\(
在他的模式中,暗示他不仅要去掉括号,还要去掉开头括号前面的空格。关于ABC(D
做什么是对的和错的都是推测,因为OP没有给出任何关于这些输入的信息。如果你只是想删除()
,那么tr//
不是正确的工具,它应该是s//
。无论如何,我重写了我的帖子