代码之家  ›  专栏  ›  技术社区  ›  Stefan Falk

使用转义字符分析简单标记而不进行查找的regex

  •  0
  • Stefan Falk  · 技术社区  · 6 年前

    注: 这必须在javascript regexp中工作

    我必须这样分析字符串:

    yo (p:abc-123-def) meets  \(p:2) \(in the cinema\) \\ (p:3) (p:4\) won't 
    

    我需要提取的是 (<entity>:<id>) 加价但忽略逃逸的事情,比如 \(in the ciname\) \\ . 从上面的示例中,regex应该只匹配

    (p:abc-123-def)
    (p:3)
    

    但不是 \(p:2) \(p:4) 因为括号是转义的。

    现在,我仍然能够修改这个标记,所以如果有一个更简单的方法来完成整个事情,我可以接受建议。如果不是的话,我需要能拿到那些 (实体:ID) Regex的加价。

    像这样的东西

    (?<!\\)\([^(?<!\\)\(]*\)
    

    虽然可以,但并非所有浏览器都支持隐藏组。

    3 回复  |  直到 6 年前
        1
  •  0
  •   trincot Jakube    6 年前

    当反斜杠重复多次时,它会变得复杂,例如: \\\\\\\\\\\\\\(p:1) . 您需要知道反斜杠的数目是偶数还是奇数才能知道 ( 是否逃逸。

    第二,括号中出现的冒号也可以转义,然后不计算(?).

    所以我建议你和 (?:\\.|[^:)\\])* 它处理转义字符( . )并对未转义的字符提出一些要求,例如 [^:)\\] .

    这就是结果:

    (?<!\\)(?:\\.)*\((?:\\.|[^:)\\])*:(?:\\.|[^:)\\])*\)

    这将使用最新版本的流行浏览器支持的Look Behind。

    如果“向后看”不是一个选项,则捕获潜在反斜杠前面的字符,并为所需的零件创建一个捕获组:

    (?:[^\\]|^)((?:\\.)*\((?:\\.|[^:)\\])*:(?:\\.|[^:)\\])*\))

    所以在这里你需要和第一个被捕获的小组合作。

        2
  •  0
  •   Derviş Kayımbaşıoğlu    6 年前

    这个regex需要工作

    /(?<!\\)\([a-zA-Z]+\:[0-9a-zA-Z_]+\)/g
    

    编辑:此代码是由javascript编译的。

    Regexpr Fiddle

        3
  •  0
  •   The fourth bird    6 年前

    一种方法是匹配你不想要的,并在一个捕获组中捕获你想要保留的。

    例如:

    \\+\([^)]+\)|\([^)]+\\+\)|(\([^:]+:[^:]+\))
    

    Regex demo

    • \\+\([^)]+\) 一个反斜杠后面跟一个开口,匹配1+次 ( 直到 )
    • |
    • \([^)]+\\+\) 比赛 ( 直到反斜杠的1倍以上 )
    • γ
    • ( 捕获组
      • \([^:]+:[^:]+\) 比赛 ( 不是 : 然后 : 又不 : 然后 )
    • ) 关闭捕获组

    const regex = /\\+\([^)]+\)|\([^)]+\\+\)|(\([^:]+:[^:]+\))/g;
    const str = `yo (p:abc-123-def) meets  \\(p:2) \\(in the cinema\\) \\\\ (p:3) (p:4\\) won't`;
    let m;
    
    while ((m = regex.exec(str)) !== null) {
      if (typeof(m[1]) != 'undefined') {
        console.log(m[1]);
      }
    }