4

シズルコードを確認し、定義を確認しました。

var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,

この正規表現が一致する文字列を見つける方法を知りたいですか?

4

3 に答える 3

4

この記事を参照してください。複数行の正規表現での説明:

var chunker = /
 (
  (?:
   # One or more sets of parentheses that contain a string, or another set of 
   parentheses with a string
   \(
   (?:
    \([^()]+\)
    |
    [^()]+
   )+
   \)
   |
   # Or one or more sets of brackets that contain a string, or another set of
   brackets with a string
   \[
   (?:
    \[[^\[\]]*\]
    |
    ['"][^'"]*['"]
    |
    [^\[\]'"]+
   )+
   \]
   |
   # Or a backslash followed by any character
   \\.
   |
   # Or one or more of any except these characters: > +~,([\
   [^ >+~,(\[\\]+
  )+
  # or any one of these characters: >+~
  |
  [>+~]
 )
 # followed by zero or one commas, which may be surrounded by whitespace
 (\s*,\s*)?
 # followed by zero or more of anything, including line endings
 ((?:.|\r|\n)*)
/g

この式には、「検証済み」セレクター式、最終的なコンマ、およびそれ以降のすべての3つの一致するグループが含まれています。セレクターで継続的に呼び出され、パーツに分割されます。詳細については、Sizzleコンストラクターを参照してください。

于 2012-07-24T14:55:05.730 に答える
1

それは投機的でしょう。ただし、RegexBuddyを使用すると、式を「文書化」して視覚化できます。

RegexBuddyを使用したドキュメント

有料のアプリケーションなので、 pastebinにコメントをエクスポートしました。これがお役に立てば幸いです。(Sizzleをサポートしておらず、式を文書化するためにJavaScript言語を使用していることに注意してください)。

于 2012-07-24T14:47:33.343 に答える
0

手作業で行う方法を学ぶには、次のように簡単に分解できます(これは将来確実に役立つタスクです)。

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
    )*
  )

中括弧は「選択セットからの任意の値としてこの内部にあるものと選択的に一致する」ことを意味するので、ここでいくつかのコメントを追加し、残りを解決できるようにします(また、一部の親はない)

(
  (?:                 //<-- 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
    )*
  )
于 2012-07-24T15:10:26.420 に答える