当前位置:  开发笔记 > 编程语言 > 正文

将Backus-Naur形式语法转换为.Net正则表达式

如何解决《将Backus-Naur形式语法转换为.Net正则表达式》经验,为你挑选了1个好方法。

有没有办法将以下Backus-Naur形式(BNF)语法转换为.Net正则表达式?(我并没有停留在BNF,但我认为这可能是解释我想要做的事情的最佳方式).

 ::= "<<"   ">>"

 ::= "" | "(" 

我很接近,但我无法弄清楚如何应对逃避\).这将捕获命名组中的fieldnameoption:

<<(?.\*?)(\((?

编辑

事实证明,我对BNF语法比我想象的更生气.

我试图得到的是括号是特殊字符.在"选项"部分中,它们必须通过斜杠进行转义.(还必须转义斜线).



1> Markus Jarde..:

BNF用于描述正则表达式通常无法描述的无上下文语言.无上下文语言与正则表达式的区别在于无上下文语言可以同时在双方进行递归.一个典型的例子是平衡括号问题.

paren = paren paren
      | '(' paren ')'  <-- there are characters on both sides of the recursion
      | ''

在您的情况下,您不使用任何双面递归,因此它简化为常规语言.

fieldname = /(?:>?[^(>])+/    //No double >, but single ones are ok.
option = /(?:[^()\\]|\\.)*/   //No parens, unless preceeded by \

pattern = /<<(?   )(?:\((?

把它放在一起:

pattern = /<<(?(?:>?[^(>])+)(?:\((?

一些边境案件:

<oo(bar>>)>> --> ('f>oo', 'bar>>')
<>  --> ('foo', 'bar\)')
<>  --> ('foo', 'bar\\')
<>   --> ('foo\', 'bar')

编辑:

如果你想要任何额外的括号字符(和回斜线)不得不在里面逃脱<<>>,你可以这样做:

fieldname = /(?:   )(?:\((?

更新:

<oo(bar>>)>> --> ('f>oo', 'bar>>')
<>  --> ('foo', 'bar\)')
<>  --> ('foo', 'bar\\')
<>   --> doesn't match
<>  --> ('foo\(', 'bar')

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有