我正在探索正则表达式中的捕获组,但是我很困惑它缺乏文档说明。例如,有人可以告诉我两个正则表达式之间的区别吗:
/(?:madhur)?/
并且
/(madhur)?/
我认为,第二个问题中的 ? 表示在字符串中与 madhur
匹配零次或一次。
第一个问题与第二个问题有何不同之处?
我正在探索正则表达式中的捕获组,但是我很困惑它缺乏文档说明。例如,有人可以告诉我两个正则表达式之间的区别吗:
/(?:madhur)?/
并且
/(madhur)?/
我认为,第二个问题中的 ? 表示在字符串中与 madhur
匹配零次或一次。
第一个问题与第二个问题有何不同之处?
这是最明显的例子:
"madhur".replace(/(madhur)?/, "$1 ahuja"); // returns "madhur ahuja"
"madhur".replace(/(?:madhur)?/, "$1 ahuja"); // returns "$1 ahuja"
回溯引用按顺序存储,第一个匹配可以使用$1
进行回忆,第二个可以使用$2
,以此类推。如果你捕获了一个匹配(即使用(...)
而不是(?:...)
),则可以使用这些引用,否则就没有什么特殊的作用。另一个例子是:
/(mad)hur/.exec("madhur"); // returns an array ["madhur", "mad"]
/(?:mad)hur/.exec("madhur"); // returns an array ["madhur"]
这不会对匹配产生任何影响。
它告诉正则表达式引擎:
replace()
方法使用(如 $1、$2 等)exec()
方法的返回数组中返回该组/(foo)\1/
中将匹配 "foofoo"
,但在 /(?:foo)\1/
中不会。在第一个中,\1
被解释为反向引用,在第二个中被解释为八进制转义序列。 - Mike Samuel" , ".match(/(\s+)?,(\s+)?/)
和 `" , ".match(/[\s+]?,[\s+]?/) 会输出不同的数组? - Muhammad Umer
" , ".match(/(\s+)?,(\s+)?/)
的结果是**[","," "," "],而" , ".match(/(\s+)?,(\s+)?/g)
或" , ".match(/[\s+]?,[\s+]?/)
的结果是[","]**。你能解释一下为什么吗? - Muhammad Umerg
可以改变match()
返回匹配的方式。 - alex