正则表达式在匹配字符串之后查找最大数字的最后一次出现
Posted
技术标签:
【中文标题】正则表达式在匹配字符串之后查找最大数字的最后一次出现【英文标题】:Regex finding the last occurrence of the highest number after a matching string 【发布时间】:2021-12-30 15:05:57 【问题描述】:我有以下文本,我想要一个匹配每个文件最后一页的正则表达式: https://regex101.com/r/DmVnK7/1
正确的正则表达式给出以下结果:
A_File1_Page1
**A_File1_Page2**
A_File2_Page1
A_File2_Page2
**A_File2_Page3**
B_File1_Page1
B_File1_Page2
**B_File1_Page3**
B_File2_Page1
B_File2_Page2
B_File2_Page3
**B_File2_Page4**
C_File1_Page1
C_File1_Page2
C_File1_Page3
C_File1_Page4
**C_File1_Page5**
【问题讨论】:
/.*Page.\n\n/g 这个几乎可以工作 谢谢,但我的长文本并没有真正的空行添加它们是为了便于代码阅读 我认为这可行:在每个页面之前选择文件名1。任何人都可以在每页 1 之前选择最后一个“.*_Page.d+”吗? ?????????? grep Page1 -B 1 /((.*(\n|\r|\r\n))1).*Page1/g 【参考方案1】:正则表达式
/(^.*_Page)\d+$(?!\r?\n\1\d+$)/gm
如果您需要 .jpg
扩展名来匹配,则如下所示:
/(^.*_Page)\d+\.jpg$(?!\r?\n\1\d+\.jpg$)/gm
示例
https://regex101.com/r/Q2Ymk2/1
或者使用.jpg
扩展名:
https://regex101.com/r/Z0MSHJ/1
说明
第一捕获组(^.*_Page)
^
在行首断言位置
.
匹配任何字符(行终止符除外)
*
匹配前一个令牌的次数在 0 次和无限次之间,尽可能多次,根据需要回馈(贪婪)
_Page
与字符 _Page
逐字匹配(区分大小写)
\d
匹配一个数字(相当于[0-9]
)
+
匹配前一个令牌一次到无限次,尽可能多次,根据需要回馈(贪婪)
$
在行尾断言位置
负前瞻(?!\r?\n\1\d+$)
断言下面的正则表达式不匹配
\r
匹配回车符 (ASCII 13)
?
匹配前一个令牌 0 到 1 次,尽可能多地匹配,根据需要回馈(贪婪)
\n
匹配换行符(换行符)(ASCII 10)
\1
匹配第一个捕获组最近匹配的相同文本
\d
匹配一个数字(相当于[0-9]
)
+
匹配前一个令牌一次到无限次,尽可能多次,根据需要回馈(贪婪)
$
在行尾断言位置
全局模式标志
g
修饰符:全局。所有匹配(第一次匹配后不返回)
m
修饰符:多行。导致 ^
和 $
匹配每行的开始/结束(不仅是字符串的开始/结束)
【讨论】:
非常感谢。当我使用扩展时遇到问题,这个正则表达式不起作用。你能看一下吗:并帮我解决一下:regex101.com/r/HT29tB/1 @LordTesla 更新了我的答案,在比赛中加入了一个带有.jpg
扩展名的示例。【参考方案2】:
使用正则表达式,我认为只能收集最后一次出现的信息。
主要是因为没有用于计数的正则表达式构造。
如果需要计数,匹配所有页面(.*?Page\d+)
然后排序和唯一。
如果只获取每个页面的最后一页就足够了,那么这个
(.*?Page)\d+(?![\s\S]*\1)
https://regex101.com/r/iP3FcV/1
( .*? Page ) # (1)
\d+
(?! [\s\S]* \1 )
【讨论】:
以上是关于正则表达式在匹配字符串之后查找最大数字的最后一次出现的主要内容,如果未能解决你的问题,请参考以下文章