正则表达式,忽略模式,如果它在引号中

时间:2012-12-12 15:01:56

标签: regex parsing scripting

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

语法类似于ASP,其中脚本以<%开头,以%>结尾。

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

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

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

但如果我有这样的命令:

<% pr "%>"; %>

......显然只匹配:

<% pr "%>

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

<% pr "hello world"; %> "

从技术上讲,结束标记被引号包围,但它不在“开放”然后“关闭”引用内,而是反过来。

如果这可能是正则表达式非常整洁,否则我怀疑如果我想支持这个功能,我将不得不手动迭代传入的文本并自己解析块,这没什么大不了的

谢谢!

1 个答案:

答案 0 :(得分:3)

我认为这个应该符合您的需求:<%(".*?"|.*?)*?%>(请参阅Demo)。

<强>解释

虽然.*尽可能与匹配.*?会尽可能少地与匹配

例如(使用伪代码),

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

,而

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