【发布时间】: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 处有所不同。
-
数组中的最后一个字符串具有最大可能的括号组数。我的数据中没有任何其他可能的组。
-
您需要处理嵌套括号的递归正则表达式的可能性。