【问题标题】:Match last regex pattern in Perl匹配 Perl 中的最后一个正则表达式模式
【发布时间】:2015-12-02 05:40:30
【问题描述】:

我正在用 Perl 编写脚本,需要从文本文件中提取一些信息。

这就是我的代码的样子 - 字符串值是组成的,但代表了所有可能的字符串变体。

my @alpha = ("abcdefgh(i) jklmno(pqrs3), uvwxyz", 
             "abcdefghi jklmn(opq1st), uvwxyz",
             "abcdefghi jklmn(o_q(1s3)), uvwxyz",
             "abcdef(gh)i jklmno(pq(1s3)), uvwxyz");

foreach my $line (@alpha){
    if ($line =~ /\((.*\(?.*\)?)\),/){
    print $1
    }
}

我正在尝试捕获最后一组括号(或我们英式英语使用者的括号)之间的大文本。
请注意,我使用的是“点”运算符,因为我想匹配任何内容、文本、数字或其他特殊字符。

基本上我想打印出来:

pqrs3
opq1st
o_q(1s3)
pq(1s3)

但我不断得到:

 (i) jklmno(pqrs3) <-- not ok
 opq1st <-- this is ok
 opq(1s3) <-- this is also ok
 gh)i jklmno(pq(1s3) <-- not ok

我做错了什么?或者甚至有可能以这种方式匹配?
任何帮助表示赞赏。

【问题讨论】:

  • 你总是想要最后一个外部匹配吗?您可能需要在此处使用解析器。看看this SO article
  • 是的,我愿意,而且没有必要有一行正则表达式。我确实尝试获取第一个括号和最后一个括号之间的所有内容,但效果不佳。
  • 另一个问题:你知道会有多少个括号组吗?在您的示例中,它似乎在 1-2 处有所不同。
  • 数组中的最后一个字符串具有最大可能的括号组数。我的数据中没有任何其他可能的组。
  • 您需要处理嵌套括号的递归正则表达式的可能性。

标签: regex perl


【解决方案1】:
(\((?:[^()]|(?1))*\))(?!.*\()

您可以在此处使用recursive 正则表达式。查看演示。

https://regex101.com/r/hE4jH0/21

【讨论】:

  • 这是我见过的最优雅的正则表达式用法之一。谢谢你。我猜 regex101 链接也有表达式的描述?
  • @Sid5427 是的 :)
  • 我在这里有点困惑...我正在尝试摆脱外括号.. (pq(1s3)) 到 pq(1s3)...
  • @Sid5427 您可以轻松地从捕获的组中剥离外部()
【解决方案2】:

这是给定字符串的一种方式:

use warnings;
use strict;

my @alpha = ("abcdefgh(i) jklmno(pqrs3), uvwxyz", 
             "abcdefghi jklmn(opq1st), uvwxyz",
             "abcdefghi jklmn(o_q(1s3)), uvwxyz",
             "abcdef(gh)i jklmno(pq(1s3)), uvwxyz");

foreach my $line (@alpha)
{
    if ( $line =~ m/.*\s+\w+\((.*)\),\s+\w+/ )
    {
        print $1, "\n";
    }
}

输出:

pqrs3
opq1st
o_q(1s3)
pq(1s3)

【讨论】:

  • 您用作锚点的间距可能不是 OP 想要的。
  • @Miller 是对的 - 我不打算将间距用作锚点,但现在看 - 它看起来也是一个不错的选择。
猜你喜欢
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多