【问题标题】:Regex, ignoring pattern if it's in quotes正则表达式,如果它在引号中,则忽略模式
【发布时间】:2012-11-30 07:38:57
【问题描述】:

编写一个非常简单的脚本解析器作为学校项目的一部分,虽然这不是必需的,但我很好奇它是否可以只使用正则表达式来完成。

语法类似于 ASP,脚本以 结尾。

它只支持一个命令“pr”,与echo或Response.Write相同。

现在我正在使用这个正则表达式来查找脚本块:

(<%\s*([\s\S]*?)\s*%>)

但如果我有这样的命令:

<% pr "%>"; %>

...它显然只匹配:

<% pr "%>

有没有办法使用纯正则表达式来忽略引号内的结束标签?我主要担心的是它可能匹配引号之间的标签,但实际上在引号之外,如果这有意义的话。比如……

<% pr "hello world"; %> "

从技术上讲,结束标签被引号包围,但它不在“打开”然后“关闭”引号内,而是相反。

如果使用非常简洁的正则表达式可以做到这一点,否则我怀疑如果我想支持此功能,我将不得不手动遍历传入的文本并自己解析块,这也没什么大不了的.

谢谢!

【问题讨论】:

  • 如果你的报价不匹配,那是不可能的。例如,为什么不将您的最后一个示例扩展到" &lt;% pr "hello world"; %&gt; "&lt;%%&gt; 不是在引号内还是引号外?您能否保证在您的最后一个示例中,后面的 " 将在稍后的输入中匹配?

标签: regex parsing scripting


【解决方案1】:

我认为这个应该适合您的需求:&lt;%(".*?"|.*?)*?%&gt;(请参阅Demo)。

说明:

.* 匹配尽可能长的时间.*? 匹配尽可能少的时间

例如(使用伪代码),

"#foo# #bar#".matches(/#(.*)#/).group(1) // will return ["foo# #bar"]

同时

"#foo# #bar#".matches(/#(.*?)#/).group(1) // will return ["foo", "bar"]

【讨论】:

  • 这很好用!我对其进行了一些调整以包含换行符并添加我需要的捕获组,它似乎工作得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多