以下是一个正则表达式,它选择相关的标记来从JS字符串构造一个s表达式。接下来是一个巨大的块评论,记录了它是如何构建的。我把它包括在内是因为我是正则表达式的新手,也许我不理解其中的一点。 我不明白为什么每个匹配regex.exec()返回的匹配应该是重复两次并分组为列表?
var tx = /\s*(\(|\)|[^\s()]+|$)/g; // Create a regular expression
/* /1 234 5 6 7 /global search
1. \s : whitespace metacharacter
2. n* : matches any string that contains zero or more
occurrences of n
3. (a|b|c) : find any of the alternatives specified
4. \( : escaped open paren, match "(" (since parens are reserved
characters in regex)
5. \) : escaped close paren, match ")"
6. [^abc] : find any character not between the brackets
7. n+ : matches any string that contains at least one n
RESULT - Find matches that have zero or more leading whitespace characters (1+2)
that are one of the following (3): open paren (4) -OR- close paren (5)
-OR- any match that is at least one non-whitespace, non-paren character (6+7)
-OR- $, searching globally to find all matches */
var textExpression = "(1 2 3)";
var execSample;
for(var i =0; i < textExpression.length; i++){
execSample = tx.exec(textExpression)
display( execSample );
}
以下是印刷品:
(,(
1,1
2,2
3,3
),)
,
null
为什么匹配重复列表?
答案 0 :(得分:3)
您在打印列表中找不到完全相同的项目。
$0
$1
如果您将正则表达式更改为:
var tx = /\s*(?:\(|\)|[^\s()]+|$)/g;
然后您将在打印列表中获得单个项目。
答案 1 :(得分:2)
这是因为你的正则表达式中有括号组。 .exec()
函数返回一个数组。在数组中,第一个元素(元素0)将包含整个匹配,然后后续元素包含匹配的组。
如果您不想这样,可以使用非捕获组:
var tx = /\s*(?:\(|\)|[^\s()]+|$)/g;