提问人:April Urban 提问时间:11/10/2023 最后编辑:zdimApril Urban 更新时间:11/12/2023 访问量:120
RegEx 问题 - Perl- 搜索字符串的最后一个实例
RegEx question- Perl- search for last instance of string
问:
对于所有正则表达式专家来说,这可能非常简单,但是我已经花了足够的时间让自己发疯,试图自己找到答案。
我使用 Doc Parser,它允许您创建文本解析规则。您可以使用正则表达式进行搜索。文档说支持 PERL 正则表达式,并且 Regex 101 站点是测试表达式的好地方,但我过去发现在 Regex 101 中起作用的表达式似乎并不总是在 Doc Parser 中起作用。
我正在尝试创建一个表达式来搜索三个字符串之一的最后一个实例。这三个字符串是:
i am sitting with after this meeting are
won't be included in your published notes
Single Signal
输入文本可以以三种不同的方式显示,这就是我寻找三个字符串之一的原因。这里有三个例子:
例 1:
Single Signal
Two things I am sitting with after this meeting are...
- Words words words
例 2:
Single Signal
- words words words
例 3:
Single Signal
words words that end in won't be included in your published notes.
- words
我捕捉到的三个短语最终成为我真正从文本中提取的内容的起点。
我将其用作我的核心/根表达式:
(?i)(i am sitting with after this meeting are|This is for internal
use and won't be included in your published notes|Single Signal)
并在表达式末尾尝试了各种方法,以指示匹配文本中最后/最晚发生的内容。
(?i)(i am sitting with after this meeting are|This is for internal
use and won't be included in your published notes|Single Signal).*?
(?i)(i am sitting with after this meeting are|This is for internal
use and won't be included in your published notes|Single Signal)+
(?i)(i am sitting with after this meeting are|This is for internal
use and won't be included in your published notes|Single Signal){1}
这在正则表达式 101、PCRE2 中有效,但在 Doc Parser (Perl) 中不起作用:
(?i)[^(i am sitting with after this meeting are|won't be included in your published notes|Single Signal)]+$
非常感谢所有的帮助。谢谢!
答:
“全局”匹配 -- 查找字符串中的所有匹配项 -- 并捕获匹配项。然后正则表达式继续通过字符串,但当它进行时,它只能捕获当前匹配项,因此我们最终会得到最后一个匹配项。在 Perl 语法中
/(one|two|three)/g
这最终在捕获变量中具有与上次匹配的三个子模式中的任何一个匹配(在列表上下文中使用时)/
一个例子
my $text = q(hi one some two or three and two more);
my @captures = $text =~ /(one|two|three)/g;
# $1 == 'two'
(capture) 变量具有字符串 .(数组的最后一个元素也是如此,但我希望该工具无法创建变量并捕获到其中。$1
two
对数组的赋值迫使正则表达式进入“列表上下文”,在该上下文中,它继续匹配整个字符串;因此,我们根据需要获得最后一次捕获。(不必实际分配给数组,以任何方式强制列表上下文就足够了。
我不知道“Doc Parser”是什么或它是如何工作的,所以我不知道如何强制该工具中使用的正则表达式变体的行为如上所述,但我认为这是可能的。
评论
seq 20| perl -e '$/=undef; $_=<>; ()=/(3|13|19)/g; print $1'
如果在初始正则表达式前面加上 (或可能 ),则最多可以有一个匹配项,因此应捕获正确的值。.*
.*\K
$ perl -e '
$t = "1a 2a 3a 1b 2b 1c 3c 2d";
$t =~ /.*(1.|2.|3.)/;
print "matched $1\n"
'
matched 2d
$
您可能需要进行调整,以便前缀也捕获换行符。
评论
.*
This worked in Regex101
除非您发布指向它的链接,否则没有任何效果。