正则表达式 – 模糊语法和PEG.js的问题(未找到示例)

前端之家收集整理的这篇文章主要介绍了正则表达式 – 模糊语法和PEG.js的问题(未找到示例)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想用以下内容的行解析文件
simple word abbr -8. (012) word,simple phrase,one another phrase - (simply dummy text of the printing; Lorem Ipsum : "Lorem" - has been the industry's standard dummy text,ever since the 1500s!; "It is a long established!"; "Sometimes by accident,sometimes on purpose (injected humour and the like)"; "sometimes on purpose") This is the end of the line

所以现在解释部分(不是所有空格都被描述,因为这里有标记):

>简单的单词是由空格分隔的一个或几个单词(短语)
> abbr – 是字符串的固定部分(永不改变)
> 8 – 可选号码
>. – 总是包括在内
>单词,简单短语,另一个短语 – 用逗号分隔的一个或多个单词或短语
> – ( – 固定部分,总是包括在内
>简单的印刷文字; Lorem Ipsum:“Lorem” – 自16世纪以来一直是业界标准的虚拟文本! – (可选)一个或多个短语分隔;
>“这是一个历史悠久的建立!”; “有时是偶然的,有时是故意的(注入幽默等)”; “有时故意” – (可选)一个或几个带引号的短语“以…分隔;
>)这是该行的结尾 – 总是包括在内

在最坏的情况下,子句中没有短语,但这种情况并不常见:应该有一个短语而不增加引号(phrase1类型)或使用它们(phrase2类型).

所以短语是自然语言句子(可能所有的标点符号)……

但:

>内部内容无关紧要(即我不需要在NLP意义上解析自然语言本身)
>只需要将其标记为phrase1或phrase2类型:

>那些没有和带引号的人,即,如果短语放在(和;或;和;或;和)之间,甚至在(和)之间用引号加,那么它就是phrase2类型
>否则,如果短语开头或结尾没有引号,虽然它可以包含短语中的所有标记,但它是短语1类型

由于为这样的输入编写正则表达式(PCRE)是一种矫枉过正,因此我研究了解析方法(EBNF或类似方法).我最终得到了一个PEG.js解析器生成器.我创建了一个基本的语法变体(即使不处理子句中不同短语的部分):

start = term _ "abbr" _ "-" .+
term = word (_? word !(_ "abbr" _ "-"))+
word = letters:letter+ {return letters.join("")}
letter = [A-Za-z]
_ "whitespace"
  = [ \t\n\r]*

或(区别仅在于“abbr – ”和“_”abbr“_” – “”):

start = term " abbr -" .+
term = word (_? word !(" abbr -"))+
word = letters:letter+ {return letters.join("")}
letter = [A-Za-z]
_ "whitespace"
  = [ \t\n\r]*

但即使这个简单的语法也无法解析字符串的开头.错误是:

>预期分析错误[A-Za-z]但找到了“”.
>解析错误预期“abbr”但发现“ – ”.
>等

因此看起来问题在于模糊性:“abbr”被用作术语作为单词标记.虽然我定义了规则!(“abbr – ”),我认为它有意义,如果下一个子字符串不是“abbr – ”类型,则只会消耗下一个字符号.

我没有找到任何解释以下PEG.js表达式的好例子,在我看来这是上述问题的可能解决方案[来自:http://pegjs.majda.cz/documentation]

>&表达
>!表达
> $表达
>& {谓词}
>! {谓词}

TL; DR:

与PEG.js相关:

>是否有任何应用规则的例子:

>&表达
>!表达
> $表达
>& {谓词}
>! {谓词}

一般问题:

>使用直观模糊语法处理此类复杂字符串的可能方法是什么?这仍然不是一种自然语言,看起来它有一些正式的结构,只有几个可选部分.其中一个想法是通过预处理来分割字符串(在正则表达式的帮助下,在固定元素的位置,即“abbr – ”“)这是行的结尾”)然后为每个分裂的部分创建一个单独的语法.但它似乎存在性能问题和可伸缩性问题(即 – 如果固定元素会发生一些变化 – 例如,将不会再出现问题.)

UPDATE1:

我找到了解决问题的规则,匹配“abbr – ”歧义:

term = term:(word (!" abbr -" _? word))+ {return term.join("")}

但结果看起来很奇怪:

[
   "simple,word"," abbr -",[
      "8",...
   ],...
]

如果删除谓词:term = term 原文链接:/regex/451907.html

猜你在找的正则表达式相关文章