3

以下は、適切なトークンを選択して JS 文字列から s 式を構築する正規表現です。これに続いて、これを行うためにどのように構築されているかを説明する巨大なブロック コメントが続きます。私は正規表現に慣れていないので、それを含めました。おそらく、これらの点の1つを理解していません。 私が理解していないのは、なぜ各一致 regex.exec() が同じ一致を 2 回繰り返し、リストとしてグループ化する必要があるのか​​ということです。

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

一致がリストとして繰り返されるのはなぜですか?

4

2 に答える 2

3

印刷されたリストにまったく同じアイテムが表示されるわけではありません。

  • 1つ目は同じスペースを持ち、表しています$0
  • 2 つ目はスペースを含まないテキストで、$1

正規表現を次のように変更すると:

var tx = /\s*(?:\(|\)|[^\s()]+|$)/g;

次に、印刷されたリストに単一のアイテムが表示されます。

于 2013-10-31T17:46:45.960 に答える
2

これは、正規表現に括弧で囲まれたグループがあるためです。関数は.exec()配列を返します。配列では、最初の要素 (要素 0) に一致全体が含まれ、その後の要素に一致したグループが含まれます。

それを望まない場合は、非キャプチャ グループを使用できます。

var tx = /\s*(?:\(|\)|[^\s()]+|$)/g; 
于 2013-10-31T17:46:53.930 に答える