Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex-通配符后的可选捕获组_Regex - Fatal编程技术网

Regex-通配符后的可选捕获组

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>

假设我有以下清单:

我想提取括号中的数字、标题和周数(如果存在)

可以工作,但最后一个组不是可选的:

否?\d{1,3}?*?\\d\

最后一组可选,仅匹配编号:

否?\d{1,3}?*?\\d \

将一种模式与周捕获相结合,而将一种模式与无周捕获相结合是可行的,但必须有更好的方法:

(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\括号之间的分组周数 ? 关闭组并将其设置为可选 如果你不想修剪标题的最后一个空格,你可以在几周前将其排除在匹配之外


谢谢,这本书写得很好,又短又甜!我修正了我的问题中第二个正则表达式的缺失谢谢,它非常出色,而且又短又甜!我修正了我问题中第二个正则表达式的缺失