如何忽略"规则中的转义元素" (正则表达式)?

时间:2016-05-09 18:35:41

标签: regex language-agnostic

我尝试使用正则表达式(正则表达式),例如(如果使用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]
    
  • 我计划创建的网址地图:

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

    返回:

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

我想要的是忽略逃到规则中的角色,我该怎么做?可以提供任何语言的例子,最重要的是正则表达式

1 个答案:

答案 0 :(得分:0)

由于你不是(也不能)做平衡文本,你能做的最好的就是帐户
用于逃生或逃生支架。
请注意,我没有包括这些正则表达式的展开版本,因为这些 需要一个身体。

(根据需要替换{})。

第一个闭包

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

扩展

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

绝对内括号

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

扩展

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