代码之家  ›  专栏  ›  技术社区  ›  Iain Fraser

我怎样才能从内尖括号中删除某些字符,而将字符单独留在外尖括号中?

  •  1
  • Iain Fraser  · 技术社区  · 16 年前

    编辑:说清楚一点,请理解我不是用Regex来解析html,那是胡说八道!我只是想清理一个凌乱的html字符串,这样它就可以解析了

    编辑#2:我还应该指出,我使用的控制字符是一个特殊的unicode字符—在任何正常情况下,它都不会在适当的标记中使用

    例如

    这里的控制字符是数字“1”。

    The quick 1<strong>orange</strong> lemming <sp11a1n 1class1='jumpe111r'11>jumps over</span> 1the idle 1frog
    

    期望输出

    The quick 1<strong>orange</strong> lemming <span class='jumper'>jumps over</span> 1the idle 1frog
    

    我的正则表达式

    请记住,这个只匹配包含控制字符的标记。

    <(([^>])*?`([^>])*?)*?>
    

    非常感谢您的时间和考虑。

    伊恩·弗雷泽

    3 回复  |  直到 16 年前
        1
  •  2
  •   polygenelubricants    16 年前

    1 在标签里。在Java中,它被修改为具有有限的lookback(因为Java不支持无限长的lookback)。

        String s = "123 <o123o></o1o1> <oo 11='11x'> x11 <msg136='I <3 Johnny!11'>";
        System.out.println(
            s.replaceAll("(?<=<[^<>]{0,999})(?=[^<>]+>)1", "")
        ); // prints "123 <o23o></oo> <oo ='x'> x11 <msg136='I <3 Johnny!'>
    

    有很多情况下,这将失败,但它应该让你开始某个地方。

    另请参见


    [aeiou] 从句子中由 < > ,其用法仅用于标记这些特殊部分。

    注意:这个正则表达式绝对不可读。但是是的,它是有效的。而且它也不用后视。

    String s = "Wait <whaaat?> does this <really really> work???";
    System.out.println(
        s.replaceAll("(?!>)(?:(?=<)|(?=\\G)(?!^))(?:(?:(?![aeiou])(.))|.)", "$1")
    ); // prints "Wait <wht?> does this <rlly rlly> work???"
    

    可以

    allocate output buffer
    set isInside := false
    for every character ch in input
       if (ch is openChar)
          isInside := true
       else if (ch is closeChar)
          isInside := false
       else if not (isInside and ch is control)
          append ch to buffer
    
        2
  •  1
  •   Amarghosh    16 年前

    通常不应该使用regex来解析html,但这不是html的开始,因此不能使用解析器。下面的方法似乎有效。

    var s = "The quick 1<strong>orange</strong> lemming <sp11a1n 1class1='jumpe111r'11>jumps over</span> 1the idle 1frog";
    while(s.match(/<[^>]*?1(?=[^>]*>)/))
      s = s.replace(/(<[^>]*?)1(?=[^>]*>)/g, "$1");
    console.log(s); //"The quick 1<strong>orange</strong> lemming <span class='jumper'>jumps over</span> 1the idle 1frog"
    
        3
  •  0
  •   Robin Day    16 年前

    我知道你不是在“解析”它。不过,您确实需要弄清楚什么是html标记,什么不是,这需要解析,单独使用regex无法处理这一点。

    也许解决标记名中的控制字符的方法是用有效的文本模式全局替换所有的控制字符。

    然后您可以使用xml/html文档解析器解析结果xml/html。然后,您可以运行此命令来执行搜索并替换标记名、属性名和值。