【问题标题】:javascript regex to match anything between single quotes, double quotes and regex slashesjavascript 正则表达式匹配单引号、双引号和正则表达式斜杠之间的任何内容
【发布时间】:2014-02-04 11:08:39
【问题描述】:

我正在尝试匹配双引号、单引号或正则表达式斜杠之间的任何内容,基本上是任何未被 javascript 标记为字符串或正则表达式的内容。到目前为止,我想出的是:

/"[^\\"\n]*(\\"[^\\"\n]*)*"|'[^\\'\n]*(\\'[^\\'\n]*)*'|\/[^\\\/\n]*(\\\/[^\\\/\n]*)*\//

但是你可以看到这有几个问题here

http://goo.gl/4Yn9pR

基本上这不应该匹配1+2/3+4/5,因为它不是一个正则表达式。另外
Dont match "Match here\\" Dont match" 应该匹配第一部分而不是第二部分(单引号和正则表达式也是如此)

这应该怎么写?

编辑:如果使用正则表达式无法区分1+2/3+4/5/*comment*//regex/,我将如何解决Dont match "Match here\\" Dont match" 问题

【问题讨论】:

  • 您无法仅使用正则表达式区分 1+2/3+4/5/*comment*//regex/ - 您需要一个合适的解析器。
  • @thg435 已注明,见编辑
  • 可以将 JavaScript 字符串文字与 JavaScript 的 RegExp 进行匹配。见这里:stackoverflow.com/questions/13799773/…(我是根据规范写的,所以保证不会过度接受或过度拒绝)。保证匹配一个有效的 JS 字符串,但不保证正确匹配任意 JS 源代码中的所有 JS 字符串(例如注释中的类似字符串的序列)。

标签: javascript regex


【解决方案1】:

刚刚想通了。我非常接近。这是解决方案:

/"[^\\"\n]*(\\["\\][^\\"\n]*)*"|'[^\\'\n]*(\\['\\][^\\'\n]*)*'|\/[^\\\/\n]*(\\[\/\\][^\\\/\n]*)*\//

DEMO

它与 thg435 答案非常相似,但我认为它的性能更高一些,因为它不会回溯那么多

我缺少的是在寻找转义引号时,我也应该一直在寻找转义反斜杠,所以我将 \\" 更改为 \\["\\] 与 thg435 的答案相反,它查看反斜杠之后的任何内容而valid可以在正则表达式引擎中使用更多的状态

【讨论】:

    【解决方案2】:

    匹配 c-alike 转义字符串的技巧是这样的:

    " (\\. | [^"]) * "
    

    也就是说,

     - quote
     - repeat (
        - one escaped char
        - or not a quote
       )
      - quote
    

    与单引号类似。由于 JS 正则表达式很难看,所以在 python 中的插图:

    import re
    
    test = r"""
        foo "bar" and "bar\"bar" and "bar\\bar" and "bar \\"
        foo 'bar' and 'bar\'bar' and 'bar\\bar' and 'bar \\'
    """
    
    rr = r"""(?x)
        " (\\. | [^"]) * "
        |
        ' (\\. | [^']) * '
    """
    
    print re.sub(rr, '@@', test)
    
    > foo @@ and @@ and @@ and @@
    > foo @@ and @@ and @@ and @@
    

    可能需要在[^"] 组中添加换行符。

    请注意,此表达式非常宽容,并且允许许多不是有效 javascript 的构造。请参阅https://stackoverflow.com/a/13800082/989121 了解完整且准确的实现。

    【讨论】:

    • 空格怎么了?而"\x4" 不是 JS 中的有效字符串。
    • 轻微的速度提升将(\\. | [^"])更改为([^"] | \\.)
    • @MosheK:不! [^"] 将使用斜杠,而未解析转义。
    • @nhahtdh:我在答案中添加了注释。我的意思是给 OP 一个想法,而不是一个完整的解决方案。
    猜你喜欢
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2016-11-03
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多