如何将正则表达式与“标题:[名称]”格式匹配?我用过
^ ([a-zA-Z0-9]) + (. *?) + \: + (. *?) + $
但失败了。
答案 0 :(得分:2)
在您的模式中,使用具有含义的空格。如果您要删除所有空格,则您的模式将匹配并看起来像以下具有3个捕获组:
^([a-zA-Z0-9])+(.*?)+\:+(.*?)+$
关于图案
当您使用量词(在本例中为+
)重复该组时,该组包含上一次迭代的值,因此您可以将量词移到该组内。
第一组匹配,直到caption
。您可以省略(.*?)+
,因为:
是下一个字符,并且将与\:+
匹配。
该部分本身可以写为:
,因为您不必逃脱冒号,而要匹配单个:
。
第二组没有考虑方括号的开头和结尾。可以使用(\[.*?\])
进行匹配,或者使用negated character class (\[[^]]+\])
如果要保留捕获组,则模式可能类似于:
^([a-zA-Z0-9]+): (\[[^\]]+\])$
答案 1 :(得分:1)
在当前的正则表达式中,您遇到很多问题
^
-这表示字符串开头后的匹配空间,而您输入的字符串没有任何内容([a-zA-Z0-9])+
-这意味着匹配组一次或多次,即尝试匹配重复的字符(. *?)
-这意味着匹配任意一个字符,然后匹配零个或多个空格字符+
-这意味着一个或多个空格字符您可以使用
/^[a-zA-Z0-9]+\s*:\s*\[[^\]]+\]$/
let str = "caption: [name]"
let reg = /^[a-zA-Z0-9]+\s*:\s*\[[^\]]+\]$/
console.log(reg.test(str))
答案 2 :(得分:1)
我猜您希望设计一个类似于以下内容的表达式:
^([^:]+)\s*:\s*(\[[^\]]+\])$
并捕获caption
和[name]
。
如果要浏览/简化/修改该表达式,请在this demo的右上角进行解释。
const regex = /^([^:]+)\s*:\s*(\[[^\]]+\])$/gm;
const str = `caption: [name]
other_captions: [other_names]`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}