正则表达式的解释

时间:2013-05-17 10:09:29

标签: regex

此正则表达式与<>之间的内容匹配:

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

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

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

请问任何人解释其含义吗?

2 个答案:

答案 0 :(得分:3)

从机制上讲,第一个正则表达式匹配尖括号(&lt;,&gt;)之间的任何字符串,但受以下限制:

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

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

  3. 让我们打破这个表达。假设您首先要求字符串必须与尖括号之间的任何非引号字符匹配。这给你:

    <[^'">]+>
    

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

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

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

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

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

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

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

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

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

答案 1 :(得分: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
    >