【问题标题】:Regex To Match &entity; or &#0-9; And Capture &正则表达式匹配 &entity;或 &#0-9;并捕获 &
【发布时间】:2009-11-19 16:12:23
【问题描述】:

我正在尝试对以下字符串原型进行替换:"I‘m singing & dancing in the rain." 以下正则表达式与实例正确匹配,但也捕获了&amp 实例后面的字符。 "(&)[#?a-zA-Z0-9;]" 从上述原型中捕获以下字符串:"&l"

如何限制它只捕获&

编辑:我应该补充一点,我不想单独匹配"&"

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    查找(这适用于命名、十进制和十六进制实体):

    &([A-Za-z]+|#x[\dA-Fa-f]+|#\d+);
    

    替换为

    &$1;
    

    请注意:这很有可能出错。我建议使用 HTML 解析器来解码文本。如果它是双重编码的,您可以对其进行两次解码。即使在小范围内,HTML 和正则表达式也不能很好地配合使用。

    由于您使用的是 JavaScript,我希望您使用的是浏览器。如果你是,你手头就有一个不错的 DOM 解析器。创建一个新元素,将字符串分配给其内部 HTML 属性并读出文本值。完成。

    【讨论】:

    • 这部分有效,但不匹配字符串,如:"ό" 我还必须将替换字符串更改为:"&$1;"
    • 我最终得到了以下搜索模式:"&([A-Za-z]+|#?[0-9]+);" 和以下替换字符串:"&$1;"
    • 我应该提到这个替换方案实际上从数字实体中删除了前导 0,但这似乎不会影响实体的呈现。此外,由于我不知道的原因,使用 "\d+" 而不是 "[0-9]" 不起作用。
    • 好的,反向引用是依赖于实现的。有些使用反斜杠,有些使用美元符号。我已经编辑了正则表达式以包含对十进制和十六进制数字实体的适当支持。
    • 哎呀,你是对的。该死。 ;-) 我将删除第二个正则表达式。
    【解决方案2】:

    我猜你想匹配&,但前提是它后面跟着一个字母数字字符或某些标点符号。这需要lookahead。这个正则表达式应该匹配你想要的,而不需要捕获或消耗任何额外的字符。

    (&)(?=[#?a-zA-Z0-9;])

    【讨论】:

    • 这在 Firefox 中没有做任何事情......虽然我没有检查其他浏览器。 JavaScript 正则表达式引擎是否支持前瞻?
    • Rob Kennedy:你错了[#?a-zA-Z0-9;] - 这是一个匹配任何一个这些字符的字符类(没有量词!)。此外,字符类没有顺序,所以它相当于[?0-9;#a-zA-Z]
    • Tomalak,你准确地描述了我的正则表达式。怎么错了?如果其中任何一个字符跟随&,我们希望正则表达式匹配。我们不关心 else 后面跟着什么,只要第一个字符在那个字符类中。至少,这就是原始正则表达式指定的内容。我选择的顺序只是模仿问题中显示的顺序。这既不重要也不相关。
    • Tomalak 正确地收集到我打算匹配需要量化的 HTML 字符实体,或者至少匹配一个合格的单个字符后的分号。
    【解决方案3】:

    实际上,您匹配字符串&l,但捕获只是&。这是因为捕获组之后的字符类将匹配一个附加字符。

    但无论如何,您的原始正则表达式开始时有点缺陷。一个(不是最优的)替换可能是:

    &(#[0-9]+|#x[0-9a-zA-Z]+|[a-zA-Z]+);
    

    它将匹配完整的实体或字符声明并捕获&

    【讨论】:

    • 这将匹配"An ampersand & and a semi-colon ;"
    • 现在好多了。 & 周围的括号不是必需的,但比赛其余部分周围的非捕获组会适得其反。你将如何更换比赛? :)
    • 哦,好吧,我还在 OP 原来的世界里,他想在那里捕获&。当然,出于所有实际目的,它是无用的,但无论如何:-)。我使用了一个非捕获组,以免将任何人与最初预期的两个捕获混淆:-)
    【解决方案4】:

    如果你只想匹配&,为什么还要包含字符类[#?a-zA-Z0-9;]

    在英语中,您的表达式将是“匹配&,后跟一个字符,即#、?、小写字母、大写字母或;”。

    只需使用(&)

    【讨论】:

      【解决方案5】:

      你的意思可能是:

      "&([#a-zA-Z0-9]+;)"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 2015-11-14
        • 1970-01-01
        • 2015-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多