我是一个正则表达式新手,花了数小时试图解决这个难题。
我认为我必须使用某种可选的非捕获组或备用组。
我要匹配以下字符串:
我的正则表达式看起来像这样:
var regex = /(?:[nN]euer [Ff]ilm\s?)(.*)(?:[vV]on).(\d{4}).(?:[Mm]it)(.*)(?:[uU]nd)(.*)/g;
问题在于它仅匹配字符串3和4。它不匹配最后两个“und”,而是将其打包在3号组中,而不是4号组中。
有人可以为我的Regex提供帮助吗(这不是很用户友好;)
最佳答案
您确实确实需要使用非捕获的可选组(例如(?:...)?
),但除此之外,您还需要 anchor (^
匹配字符串的开头和$
匹配字符串的结尾)和惰性点匹配模式(.*?
,以匹配为尽可能少的字符)。
您可以使用
/^[nN]euer [Ff]ilm\s*(.*?)(?:\s*[vV]on\s+(\d{4}))?(?:\s+[Mm]it\s*(.*?)(?:\s*[uU]nd\s*(.*))?)?$/
参见regex demo。在演示中,由于输入是多行字符串,因此
/gm
修饰符是必需的。模式详细信息:
^
-字符串 anchor [nN]euer [Ff]ilm
-Neuer film
/ Neuer Film
/ neuer Film
\s*
-零个或多个空格(.*?)
-组1:除换行符以外的任何0+字符,并且尽可能少(即,直到后续子模式的最左出现)(?:\s*[vV]on\s+(\d{4}))?
-1次或0次出现:\s*
-0+空格[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+空格(.*?)
-组3匹配除换行符以外的任何0+字符,(?:\s*[uU]nd\s*(.*))?
-可选的非捕获组匹配\s*[uU]nd\s*
-包含0+空格的und
或Und
(.*)
-组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]);
}
}
关于javascript - 正则表达式可选非捕获组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43354986/