有没有办法将以下Backus-Naur形式(BNF)语法转换为.Net正则表达式?(我并没有停留在BNF,但我认为这可能是解释我想要做的事情的最佳方式).
::= "<<" ">>" ::= "" | "("
我很接近,但我无法弄清楚如何应对逃避\
和)
.这将捕获命名组中的fieldname
和option
:
<<(?.\*?)(\((? .*?)\))?>>
编辑
事实证明,我对BNF语法比我想象的更生气.
我试图得到的是括号是特殊字符.在"选项"部分中,它们必须通过斜杠进行转义.(还必须转义斜线).
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 = /(?:[^()\\<]|\\[()\\])+/ options = /(?:[^()\\]|\\[()\\])*/ pattern = /<<(?)(?:\((? )\))?>>/ /<<(? (?:[^()\\]|\\[()\\])+)(?:\((? (?:[^()\\]|\\[()\\])*)\))?>>/
更新:
<oo(bar>>)>> --> ('f>oo', 'bar>>') < > --> ('foo', 'bar\)') < > --> ('foo', 'bar\\') < > --> doesn't match < > --> ('foo\(', 'bar')