Regex-通配符后的可选捕获组
假设我有以下清单: 我想提取括号中的数字、标题和周数(如果存在) 可以工作,但最后一个组不是可选的: 否?\d{1,3}?*?\\d\ 最后一组可选,仅匹配编号: 否?\d{1,3}?*?\\d \ 将一种模式与周捕获相结合,而将一种模式与无周捕获相结合是可行的,但必须有更好的方法:Regex-通配符后的可选捕获组,regex,Regex,假设我有以下清单: 我想提取括号中的数字、标题和周数(如果存在) 可以工作,但最后一个组不是可选的: 否?\d{1,3}?*?\\d\ 最后一组可选,仅匹配编号: 否?\d{1,3}?*?\\d \ 将一种模式与周捕获相结合,而将一种模式与无周捕获相结合是可行的,但必须有更好的方法: (No (?<no>\d{1,3}) (?<title>.*) \((?<weeks>\d)\))|(No (?<no>\d{1,3}) (?<title>
(No (?<no>\d{1,3}) (?<title>.*) \((?<weeks>\d)\))|(No (?<no>\d{1,3}) (?<title>.*))
我使用C和javascript,但我想这是一个一般的正则表达式问题。您可以将此正则表达式与可选的最后一部分一起使用:
^No (?<no>\d{1,3}) (?<title>.*?\S)(?: \((?<weeks>\d)\))?$
您可以将此正则表达式与可选的最后一部分一起使用:
^No (?<no>\d{1,3}) (?<title>.*?\S)(?: \((?<weeks>\d)\))?$
你的正则表达式快到了 首先也是最重要的一点,你应该在最后加上一美元。这是什么意思?一直匹配到字符串的末尾。目前,?*?匹配一个空字符串,然后停止,因为它意识到它已经到达了剩余正则表达式匹配的点。为什么正则表达式的其余部分匹配?因为可选组可以匹配任何空字符串。通过放入$,您使正则表达式的其余部分更难匹配 其次,您忘记匹配一个开括号\ 您的正则表达式应该是这样的:
No (?<no>\d{1,3}) (?<title>.*?)( \((?<weeks>\d)\))?$
你的正则表达式快到了 首先也是最重要的一点,你应该在最后加上一美元。这是什么意思?一直匹配到字符串的末尾。目前,?*?匹配一个空字符串,然后停止,因为它意识到它已经到达了剩余正则表达式匹配的点。为什么正则表达式的其余部分匹配?因为可选组可以匹配任何空字符串。通过放入$,您使正则表达式的其余部分更难匹配 其次,您忘记匹配一个开括号\ 您的正则表达式应该是这样的:
No (?<no>\d{1,3}) (?<title>.*?)( \((?<weeks>\d)\))?$
另一个选项是标题不匹配,或者当它遇到一个字符时,后面不应该跟一个数字和一个右括号
^No (?<no>\d{1,3}) (?<title>(?:[^(\r\n]+|\((?!\d\)))+)(?:\((?<weeks>\d)\))?
部分地
^没有
?\d{1,3}群号与空间
?
?:非捕获组
[^\r\n]+匹配除或换行符以外的任何字符
|或
\?!\d \如果不直接后跟数字和,则匹配
+关闭组并重复1+次
封闭组标题
?:非捕获组
\?\d\括号之间的分组周数
? 关闭组并将其设置为可选
如果你不想修剪标题的最后一个空格,你可以在几周前将其排除在匹配之外
另一个选项是标题不匹配,或者当它遇到一个字符时,后面不应该跟一个数字和一个右括号
^No (?<no>\d{1,3}) (?<title>(?:[^(\r\n]+|\((?!\d\)))+)(?:\((?<weeks>\d)\))?
部分地
^没有
?\d{1,3}群号与空间
?
?:非捕获组
[^\r\n]+匹配除或换行符以外的任何字符
|或
\?!\d \如果不直接后跟数字和,则匹配
+关闭组并重复1+次
封闭组标题
?:非捕获组
\?\d\括号之间的分组周数
? 关闭组并将其设置为可选
如果你不想修剪标题的最后一个空格,你可以在几周前将其排除在匹配之外
谢谢,这本书写得很好,又短又甜!我修正了我的问题中第二个正则表达式的缺失谢谢,它非常出色,而且又短又甜!我修正了我问题中第二个正则表达式的缺失