1

この regex の理解を正してくれる人が必要なだけです。これは、HTML タグを一致させるための応急処置のようなものです。

< (?: "[^"]*" ['"]* | '[^']*'['"]*|[^'">])+ >

私の理解 -

  • < -タグのオープン記号を一致させます
  • (?:- ここで何が起こっているのか理解できません。これらの記号は何を意味しますか?
  • "[^"]*['"]*二重引用符で囲まれた任意の文字列。ここに何か他のものがありますか?
  • '[^']*'['"]*- 一重引用符で囲まれた文字列
  • [^'">]- ' " > 以外の任意の文字。

したがって、'<' 記号です。二重引用符または単一引用符で囲まれた文字列、または ' " または > を含まないその他の文字列が続き、1 回以上繰り返されてから '>' が続きます
。 .

4

3 に答える 3

5
<       # literally just an opening tag followed by a space
(       # the bracket opens a subpattern, it's necessary as a boundary for
        # the | later on
?:      # makes the just opened subpattern non-capturing (so you can't access it
        # as a separate match later
"       # literally "
[^"]    # any character but " (this is called a character class)
*       # arbitrarily many of those (as much as possible)
"       # literally "
['"]    # either ' or "
*       # arbitrarily many of those (and possible alternating! it doesn't have
        # to be the same character for the whole string)
|       # OR
'       # literral *
[^']    # any character but ' (this is called a character class)
*       # arbitrarily many of those (as much as possible)
'       # literally "
['"]*   # as above
|       # OR
[^'">]  # any character but ', ", >
)       # closes the subpattern
+       # arbitrarily many repetitions but at least once
>       # closing tag

正規表現内のすべてのスペースは、他の文字と同じように扱われることに注意してください。それらは正確に1つのスペースに一致します。

^また、キャラクタークラスの冒頭にあることに特に注意してください。個別の文字としては扱われませんが、文字クラス全体が反転します。

また、(義務的に)正規表現はHTMLの解析には適切ではないことを付け加えるかもしれません。

于 2012-10-04T07:38:53.613 に答える
2

sで分割します。これはs|を示します。or

<
  (?:
    "[^"]*" ['"]* |
    '[^']*'['"]* |
    [^'">]
  )+
>

(?:一致しないグループを示します。そのグループの内部はこれらのものと(この順序で)一致します:

  1. "stuff"
  2. 'stuff'
  3. asd=

事実上、これはHTMLタグを属性と一致させようとする正規表現です。

于 2012-10-04T07:40:42.567 に答える
0

これがYAPE::Regex::Explainの結果です

(?-imsx:< (?: "[^"]*" ['"]* | '[^']*'['"]*|[^'">])+ >)

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  <                        '< '
----------------------------------------------------------------------
  (?:                      group, but do not capture (1 or more times
                           (matching the most amount possible)):
----------------------------------------------------------------------
     "                       ' "'
----------------------------------------------------------------------
    [^"]*                    any character except: '"' (0 or more
                             times (matching the most amount
                             possible))
----------------------------------------------------------------------
    "                        '" '
----------------------------------------------------------------------
    ['"]*                    any character of: ''', '"' (0 or more
                             times (matching the most amount
                             possible))
----------------------------------------------------------------------
                             ' '
----------------------------------------------------------------------
   |                        OR
----------------------------------------------------------------------
     '                       ' \''
----------------------------------------------------------------------
    [^']*                    any character except: ''' (0 or more
                             times (matching the most amount
                             possible))
----------------------------------------------------------------------
    '                        '\''
----------------------------------------------------------------------
    ['"]*                    any character of: ''', '"' (0 or more
                             times (matching the most amount
                             possible))
----------------------------------------------------------------------
   |                        OR
----------------------------------------------------------------------
    [^'">]                   any character except: ''', '"', '>'
----------------------------------------------------------------------
  )+                       end of grouping
----------------------------------------------------------------------
   >                       ' >'
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------
于 2012-10-04T08:07:32.487 に答える