要学习如何手工完成,您可以像这样简单地分解它(这是一项将来肯定会帮助您的任务):
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
第一部分是了解一个正则表达式通常是如何编写的,所以在这种情况下应该是:
var variableName = /stuff/g;
^ ^ ^^
delimiters/---+--/|
| |
regex / \global modifier, can also have a case modifier
所以让我们去掉修饰符以及开始和结束,只计算正则表达式:
((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)
仍然是 gobbledygook,但让我们继续:正则表达式用于捕获内容,我们知道未转义(意味着他们在被转义的字符之前使用反斜杠 \)括号捕获大括号,让我们添加每个括号周围都有一些换行符(仅用于检查!!!)和管道表示“或”
(
(?:
\(
(?:
\(
[^()]+
\)
|
[^()]+
)+
\)
|
\[
(?:
\[[^\[\]]*\]
|
['"][^'"]*['"]
|
[^\[\]'"]+
)+
\]
|
\\.
|
[^ >+~,
(
\[\\]+)+
|
[>+~]
)
(\s*,\s*)?
(
(?:
.
|
\r
|
\n
)*
)
方括号的意思是“有选择地将其中的内容作为选择集中的任何值匹配”,所以现在我要添加一些 cmets,然后让您计算其余部分(而且,它看起来确实像缺少一些括号)
(
(?: //<-- start a non-capturing group (means, don't tell the app we matched)
\(
(?: //<-- start a non-capturing group (means, don't tell the app we matched)
\(
[^()]+ //one or more paren pairs inside a paren pair
\)
|
[^()]+ //or one or more paren pairs
)+
\)
|
\[
(?:
\[[^\[\]]*\]
|
['"][^'"]*['"]
|
[^\[\]'"]+
)+
\]
|
\\.
|
[^ >+~,
(
\[\\]+)+
|
[>+~] //either a tilde, plus or opening brace
)
(\s*,\s*)?
(
(?:
.
|
\r
|
\n
)*
)