我是一个完整的正则表形Noob,花了好几个小时试图解决这个难题。 我想我必须使用某种可选的非捕获组或交替。
我想匹配以下字符串:
Neuer Film a von 1000
Neuer Film a von 1000 mit b
Neuer Film a von 1000 mit b und c
Neuer Film a von 1000 mit b und c und d
Neuer Film a mit b
Neuer Film a mit b und c
- 醇>
Neuer Film a mit b und c und d
我的正则表达式如下:
var regex = /(?:[nN]euer [Ff]ilm\s?)(.*)(?:[vV]on).(\d{4}).(?:[Mm]it)(.*)(?:[uU]nd)(.*)/g;
问题是它只匹配字符串3和4.它与最后两个“und”不匹配,但是将它打包在组No.3中而不是组No.4中。
有人可以帮助我的正则表达式(根本不是非常用户友好;)
答案 0 :(得分:7)
您确实需要使用非捕获可选组(例如(?:...)?
),但此外,您还需要 anchors (^
来匹配字符串的开头和$
以匹配字符串结束)和懒字点匹配模式(.*?
,以匹配尽可能少的字符。)
您可以使用
/^[nN]euer [Ff]ilm\s*(.*?)(?:\s*[vV]on\s+(\d{4}))?(?:\s+[Mm]it\s*(.*?)(?:\s*[uU]nd\s*(.*))?)?$/
请参阅regex demo。在演示中,/gm
修饰符是必需的,因为输入是多行字符串。
模式详情:
^
- 字符串锚的开始[nN]euer [Ff]ilm
- Neuer film
/ Neuer Film
/ neuer Film
\s*
- 零个或多个空格(.*?)
- 第1组:除了换行符之外的任何0 +字符,尽可能少(也就是说,直到最左边后续子模式的出现)(?:\s*[vV]on\s+(\d{4}))?
- 1次或0次出现:
\s*
- 0+ whitespaces [vV]on
- von
或Von
\s+
- 1+空格(\d{4})
- 第2组:4位(?:\s+[Mm]it\s*(.*?)(?:\s*[uU]nd\s*(.*))?)?
- 一个可选的非捕获组,匹配1或0次出现:
\s+
- 1+空格[Mm]it
- Mit
或mit
\s*
- 0+ whitespaces (.*?)
- 第3组匹配除了换行符之外的任何0 +字符,尽可能少(?:\s*[uU]nd\s*(.*))?
- 可选的非捕获组匹配
\s*[uU]nd\s*
- und
或Und
附有0 +空格(.*)
- 第4组匹配除了换行符之外的任何0+字符,尽可能多$
- 字符串结束。
var strs = ['Neuer Film a von 1000','Neuer Film a von 1000 mit b','Neuer Film a von 1000 mit b und c','Neuer Film a von 1000 mit b und c und d','Neuer Film a mit b','Neuer Film a mit b und c','Neuer Film a mit b und c und d'];
var rx = /^[nN]euer [Ff]ilm\s*(.*?)(?:\s*[vV]on\s+(\d{4}))?(?:\s+[Mm]it\s*(.*?)(?:\s*[uU]nd\s*(.*))?)?$/;
for (var s of strs) {
var m = rx.exec(s);
if (m) {
console.log('-- ' + s + ' ---');
console.log('Group 1: ' + m[1]);
if (m[2]) console.log('Group 2: ' + m[2]);
if (m[3]) console.log('Group 3: ' + m[3]);
if (m[4]) console.log('Group 4: ' + m[4]);
}
}