【问题标题】:How to ignore escaped elements in a "rule" (regular expression)?如何忽略“规则”(正则表达式)中的转义元素?
【发布时间】:2016-09-04 12:24:41
【问题描述】:

我正在尝试使用正则表达式(正则表达式),例如(如果使用 javascript):

var str = '[abc\[0123\]] [efg\[987\]h] [Hello \[world\]!] [foo [baz]]';
str.match(/\[(.*?)\]/g);

输出:["[abc[0123]", "[efg[987]h", "[Hello [world]!", "[foo [baz]"]

或者

var str = '{abc\{0123\}} {efg\{987\}h} {Hello \{world\}!} {foo {baz}}';
str.match(/\{(.*?)\}/g);

输出:["{abc{0123}", "{efg{987}", "{Hello {world}", "{foo {baz}"]

但我需要您忽略第一个未作为[foo [baz]] 转义的项目,仅捕获[baz] 以及其他已转义的项目:

 ["[abc[0123]]", "[efg[987]h]", "[Hello [world]!]", "[baz]"]

第二个例子返回:

 {"{abc{0123}}", "{efg{987}h}", "{Hello {world}!}", "{baz}"]

我最初的目的是学习,但也计划在诸如类似于 CSS 选择器的结构中使用:

  • 例如:

    input[name=\[0\]], input[name=foo\[baz\]\[bar\]]
    

    返回:

    [0], [1]
    
  • 以及我计划创建的 URL 地图:

    /{name}/{foo\{bar}/{baz\{foo\}}/
    

    返回:

    {name}, {foo{bar}, {baz{foo}}
    

我想要忽略转义到规则中的字符,我该怎么做?可以提供任何语言的例子,最重要的是Regex

【问题讨论】:

  • 我猜你的意思是var str = '[abc\\[0123\\]] [efg\\[987\\]h] [Hello \\[world\\]!] [foo [baz]]';。然后,如果要匹配转义的][,请使用\[[^\[\]\\]*(?:\\.[^\[\]\\]*)*\]。请注意,它不会匹配 [foo [baz]],因为内括号没有转义。

标签: regex language-agnostic


【解决方案1】:

既然你不是(也不能)做平衡的文字,你能做的最好的就是帐户
用于转义转义或转义括号。
请注意,我没有包含这些正则表达式的展开版本,因为这些
需要身体。

(根据需要替换 {})。

第一次关闭

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

展开

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

绝对内括号

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

展开

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多