2

この正規表現パターンを適用する:

/(?:(^| |\>|\+))+([a-z\-\_]+)/gi

この文字列に:

body.test ol+li ol > li #foobar p>span a[href=*]

これらの一致をコンマ区切りで取得します。

body, ol,+li, ol, > li, p,>span, a

一部の一致の先頭にスペースと記号があるのはなぜですか? 正規表現のこの部分がこれらの兆候と一致することを期待していますが、それらをキャプチャすることはできません。>+(?:(^| |\>|\+))

編集:cssセレクターのcss特異性に貢献するhtmlタグとcssセレクターを一致させようとしています。したがって、 orなしで、それぞれliまたはspanその他を単独で一致させたいと考えています。+>

4

4 に答える 4

3

キャプチャはマッチングと同じではありません。パターンでコンビネータを指定しているので、キャプチャされているかどうかに関係なく、マッチャーによってピックアップされます。

キャプチャするには、文字列の正規表現を使用して、キャプチャグループexec()含む結果をループする必要があります。また、パターンをクリーンアップして変更し、不必要にキャプチャせず、一般的な兄弟コンビネータを認識できるようにしました。~

var sel = "body.test ol+li ol > li #foobar p>span a[href=*]";
var re = /(?:^| |>|\+|~)+([a-z_-]+)/gi;
var matches = [], m;

while (m = re.exec(sel)) {
    matches.push(m[1]);
}

次に、予想される一致を取得します。

body, ol, li, ol, li, p, span, a
于 2013-02-09T13:31:45.853 に答える
2

の内側のブラケット(?:(^| |\>|\+))は、キャプチャされたグループを作成しています。+ キャプチャしないようにすることもできます。外側の括弧内に数量詞を含める必要があると思います。

/(?:(?:^| |\>|\+)+)([a-z\-\_]+)/gi

また、代わりに文字クラスを使用して、それらの間にそれらを入れないようにすることもできます。また、 andpipesをエスケープする必要もありません。ただし、文字クラスの先頭で使用しないように注意してください。そうしないと、すべてが無効になります。>+caret(^)

/(?:[ >+^]+)([a-z_-]+)/gi

文字クラスで-エスケープする必要はありません。_最後に を使用するだけ-で、すべて問題ありません。

于 2013-02-09T11:32:03.330 に答える
0

2 つのキャプチャ グループが(^| |\>|\+)あり([a-z\-\_]+)、最初の 1 つは非キャプチャ グループの直接の内部にあります。それを削除するだけです:

/(?:^| |>|\+)+([a-z_-]+)/gi

繰り返し (グローバル) マッチング中にキャプチャされたグループを取得する方法については、 JavaScript の正規表現とサブマッチを参照してください。ところで、.split(/[ >+]+/)orを使用することもできます.match(/[^ >+]+/g)

于 2013-02-09T12:09:05.880 に答える
0

ここにキャプチャ グループがあります: (^| |\>|\+)

于 2013-02-09T11:32:39.213 に答える