【问题标题】:Apply Perl RegExp to Remove Parenthesis and Text at End of String应用 Perl RegEx 删除字符串末尾的括号和文本
【发布时间】:2018-09-09 16:33:08
【问题描述】:

我有一个字符串,其中包含括号和括号内的文本。如何删除字符串末尾带有文本的括号,同时保留字符串中的其他单词?

输入:

   Potatoes Rice (Meat)

输出:

   Potatoes Rice

我的代码:

#! /usr/bin/perl
use v5.10.0;
use warnings;

my $noparenthesis = "Potatoes Rice (Meat)";
$noparenthesis =~ s/^/$1/gi;
say $noparenthesis;

【问题讨论】:

  • $noparenthesis =~ s/\(.*$//g括号里还有别的词吗??
  • 我建议你看一下教程perlretut,或者一本好书的正则表达式教程。
  • 好吧,我好像是这样。第一次阅读一个主题会更容易,特别是在涉及正则表达式时。它是一种迷你语言,虽然你可以开始有效地使用它,但它有一个结构和规则。不了解这些基础知识会让事情变得更加更加困难。
  • @Onyambu:不:这是非常具有误导性的。您的模式所做的就是从第一个左括号中删除 everything 到字符串的末尾。这不是我们要求的。
  • @Borodin 看来这就是 Op 的数据结构。无论如何,可以有各种各样的东西要看。我确实在我提供的答案的评论部分解决了他们

标签: regex perl


【解决方案1】:
#! /usr/bin/perl
use v5.10.0;
use warnings;

my $noparenthesis = "Potatoes Rice (Meat)";
$noparenthesis =~ s/\(.*$//g;
say $noparenthesis;

如果括号中还有其他单词由于不在句末而您想保留,那么您可以使用以下表达式:

 $noparenthesis =~ s/\s*\([^()]+\)\s*$//g;

这只会删除字符串末尾的括号、可能的尾随空格以及它们前面的空格(因此字符串中不会保留尾随空格)。由于 () 字符在匹配的括号内是不允许的,因此否定字符类不会匹配嵌套括号,如果字符串有的话。

【讨论】:

  • 现在这不会触及嵌套的括号,这可能是好的,但值得一提。另外,在括号旁边允许空格怎么样?
  • @zim,如果我想让事情复杂化,那么我可以使用(\(([^()]*)(?:(?1)(?2))*\))$,它会考虑到你想要的一切
  • 是的,它变得更加混乱......我并不是要建议复杂的事情,但可能只是提到限制、特殊情况(如果有的话)等。我会在合适的地方添加\s*一种简单而现实的可能性,可以摆脱它。
  • @zdim 明白了。会考虑到这一点。我希望(\(([^()]*)(?:(?1)(?2))*\))$ 能解决所有问题
  • 更多层次的嵌套怎么样?然后,一旦你找到一个模块来处理嵌套 delims 的严重问题——我们是想把它全部吹走,还是只吹走外部的——还是只吹走内部的?但是,我们想首先触及它吗?这就是为什么我说应该有一个要求来说明这一点。在这种情况下,似乎 OP 在他们的数据中有某种括号注释,一个简单的解决方案可能是合适的。尽管如此,任何此类数据都可能发生嵌套括号,因此我建议在其上留下注释。
猜你喜欢
  • 1970-01-01
  • 2012-05-20
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多