【问题标题】:Regex: match anything but not "<", "{{" and "{%"正则表达式:匹配除“<”、“{{”和“{%”之外的任何内容
【发布时间】:2016-01-16 00:44:58
【问题描述】:

我尝试实现词法分析器并尝试创建正则表达式,它将匹配任何内容,但不匹配以下内容:

  • {{
  • {%

我正在尝试:

[^(<|{{|{%)]+

但它也不看蚂蚁单“{”和“%”符号。

可以用正则表达式吗?

输入:“foo {{ bar

【问题讨论】:

  • 所以假设文本是a {{ b。从头开始,有一个子字符串a {,不包含&lt;,不包含{{,不包含{%。所以按照你的逻辑应该匹配。但我很确定这不是你想要的。 (如果您认为我过于字面,请记住,如果您创建的正则表达式在您的问题中具有确切的标准,那么这种过于字面的解释正是计算机会给出的。)
  • 前瞻?我只需要匹配“a”和“b”。
  • 我猜你会想要“a”和“b”,但是是的,无论哪种方式,都可以通过前瞻来实现。但我认为最简单的方法是做 mevdschee 回答的事情。
  • 那不是一个选项然后你创建词法分析器(如 flex)。

标签: regex


【解决方案1】:

您可以使用基于环视的正则表达式:

(?<=\s|^)(?!{[{%]|<)\S+

(?!{[{%]) 是负前瞻,以匹配不是{{{% 的任何非空格文本。

RegEx Demo

【讨论】:

  • 太棒了!如何也匹配空格而不是“
  • 好的,您能否提供一些示例输入和有问题的预期匹配项。这会让事情更清楚。
  • 谢谢!我认为这是解决方案。但看起来不能在由ошыщтю生成的词法分析器中使用前瞻,所以我需要找到另一个解决方案。还是谢谢!
【解决方案2】:

我认为您正在编写一种模板语言,您可能希望拆分这些字符,对吗?如果是这样,那么你就拆分正则表达式:(&lt;|{{|{%)

使用http://www.regexr.com/ 了解有关正则表达式的更多信息。

【讨论】:

  • 我不分裂。我正在解析,所以我需要匹配除此符号之外的任何内容。
  • @AntonMedvedev 如果您知道这些标记在哪里(并且大多数正则表达式引擎确实会告诉您匹配的位置),那么您也已经掌握了它们之间的所有内容。寻找一个标记的结束位置和下一个标记的开始,你就有了文本的开始和结束位置。
  • @hvd 是的,这就是我应该写的:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 2016-05-05
相关资源
最近更新 更多