0

此正则表达式匹配 a<和 之间的内容>

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

但这也可以通过使用以下表达式来完成<([a-z]*|[A-Z]*|[a-zA-Z0-9]*)>

第一个 RE 中方括号中的表达式不清楚。

谁能解释一下它的意思?

4

2 回答 2

3

机械地,第一个正则表达式匹配尖括号(<,>)之间的任何字符串,但受到以下限制:

  1. 单引号或双引号 (SDQ) 最终必须跟在第二个相同类型的单引号或双引号 (SDQ) 之后。例如,<This "te>xt"><This 'text'>是有效的,但<This "text><This "text'>不是。

  2. 第一项中的第二个引号可以紧跟任意数量的单引号或双引号,这些不受 (1) 中的限制。例如,<This "text"">and<This "text"'>是有效的,但<This "text" ">不是。

让我们分解这个表达式。假设您从要求字符串必须匹配尖括号之间的任何非引号字符开始。这给了你:

<[^'">]+>

这在功能上与此等效,其中?:表示未捕获的组:

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

现在假设您想要允许单引号和双引号,前提是它们是平衡的。这将表达式扩展为:

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

这个新表达式允许在两个尖括号之间以任意顺序任意组合以下内容:

  • 双引号之间的任意数量的字符
  • 单引号之间的任意数量的字符
  • 不是右括号的字符 引号

最后,假设您想进一步扩展此表达式以允许紧跟在引号组之后的任意数量的单引号或双引号(上面的第 1 项和第 2 项)。(也许是为了允许某种形式的转义。)这可以通过["']*在两个引号组之后添加来合并到表达式中:

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

这给出了最终表达式。请注意,此表达式不同于<([a-z]*|[A-Z]*|[a-zA-Z0-9]*)>(等效于<[a-zA-Z0-9]*)>),因为后者根本不允许使用引号。

于 2013-05-17T10:50:15.090 回答
0

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

    Sequence: match all of the followings in order
    <
    Repeat
        NonCapturingGroup
            OR: match either of the followings
                Sequence: match all of the followings in order
                    "
                    Repeat
                        AnyCharNotIn["]
                        zero or more times
                    "
                    Repeat
                        AnyCharIn['"]
                        zero or more times
                Sequence: match all of the followings in order
                    '
                    Repeat
                        AnyCharNotIn[']
                        zero or more times
                    '
                    Repeat
                        AnyCharIn['"]
                        zero or more times
            AnyCharNotIn[ ' " >]
        one or more times
    >
于 2013-05-17T10:17:48.380 回答