我想在开始和结束标记(<%
和%>
)之间的源代码中匹配多行,但我需要输出变量(如果这就是它的话)被称为在匹配的代码块的 end 处排除任何周围的换行符。因为我正在进行替换,所以我仍然需要一直替换结束标记(%>
),无论该标记之前是否有换行符。
简化示例:
<%
SomeCode1
SomeCode2
SomeCode3
SomeCode4
%>
目标是使用$x
输出(包括)SomeCode1
和SomeCode4
之间的代码行,同时保留2到3之间的新行,但< strong>在4 之后排除任何换行。
到目前为止,我提出的(在此简化)是将<%([ \t\r\n]*)([^%]*)%>
替换为x$2y
。实际情况更复杂,但这可以显示基本问题,即结果包含SomeCode4
和%>
之间的任何额外换行符。 如何在排除尾随换行符的同时替换整个交易?
更新1:真正的目标是以清晰的方式组合相邻的内联ASPX VB.NET代码块。示例输入:
<% SomeCode()
SomeCode2()
%>
<%
SomeCode3()
SomeCode4()
%>
以下替换的结果似乎非常适合在没有无关新行的情况下进行组合,尽管它仍然可能包含最终形式的一些额外换行符:
更换:
(\r\n)([\s]*)<%(?!=|-)[\s\r]*([^%]*?)[\s\r]*%>[\s\r]*<%(?!=|-)[\s\r]*([^%]*)
使用:
$1$2<%$1$2 $3$1$2 $4$1$2
上面示例的输出与上面的替换(在SomeCode2()
之后删除换行符,但在结果结尾时仍然有换行符):
<%
SomeCode()
SomeCode2()
SomeCode3()
SomeCode4()
%>
对于那些想知道,简单替换%>[\s\r]*<%
不可行的原因是因为它可能包含注释(<%--abc--%>
)和其他内联代码表达式(<%=abc%>
),两者都是其中需要从替换操作中排除。
更新2(看起来不错):在WiktorStribiżew的帮助下,在答案和评论中,我能够找到一些简短的东西,似乎在Visual Studio 2017和Online Demo:
更换:
(\r?\n)([ \t]*)<%(?!=|-)[\s]*([^%]*?)[\s]*%>[\s]*<%(?!=|-)[\s]*([^%]*?)[\s]*(%>)
使用:
$1$2<%$1$2 $3$1$2 $4$1$2$5
请务必在备注语法的注释中查看Wiktor的演示。
答案 0 :(得分:1)
您可以使用
<%([\s\r]*)([^%]*?)[\s\r]*%>
<强>详情
<%
- 文字子字符串([\s\r]*)
- 第1组(可以用替换模式中的$1
引用):任何0+空格(在VS S&amp; R中,\s
不匹配{{ 1}})\r
- 第2组:除([^%]*?)
之外的任何0 +字符,尽可能少(因为%
是一个惰性量词,并且首先尝试后续模式,并且仅当他们无法匹配,这种模式“扩大”)*?
- 0+ whitespaces [\s\r]*
- 一个文字子字符串。