RegEx与空格匹配,但在输出

时间:2017-11-18 16:05:10

标签: asp.net regex replace visual-studio-2017

我想在开始和结束标记(<%%>)之间的源代码中匹配多行,但我需要输出变量(如果这就是它的话)被称为在匹配的代码块的 end 处排除任何周围的换行符。因为我正在进行替换,所以我仍然需要一直替换结束标记(%>),无论该标记之前是否有换行符。

简化示例:

<%
    SomeCode1
    SomeCode2

    SomeCode3
    SomeCode4

%>

目标是使用$x输出(包括)SomeCode1SomeCode4之间的代码行,同时保留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的演示。

1 个答案:

答案 0 :(得分:1)

您可以使用

<%([\s\r]*)([^%]*?)[\s\r]*%>

<强>详情

  • <% - 文字子字符串
  • ([\s\r]*) - 第1组(可以用替换模式中的$1引用):任何0+空格(在VS S&amp; R中,\s不匹配{{ 1}})
  • \r - 第2组:除([^%]*?)之外的任何0 +字符,尽可能少(因为%是一个惰性量词,并且首先尝试后续模式,并且仅当他们无法匹配,这种模式“扩大”)
  • *? - 0+ whitespaces
  • [\s\r]* - 一个文字子字符串。