这可能很简单。我只想匹配字符串中的所有字符串,包括新的换行符。 例:
文本文件:
MESSAGE BEGIN
mary had a little lamb.
little lamb
MESSAGE END
输出期望:
mary had a little lamb.
little lamb
这是我目前拥有的。 它工作正常,除了一切都在 1 行中。
代码(我目前有):
$pattern= Regex::"MESSAGE BEGIN(.*?)MESSAGE END"
[regex]::Match($text,$pattern).Groups[1].Value
结果:
mary had a little lamb.little lamb
我希望它尊重换行符,这样它们就不会全部挤在一起。
使用环顾四周:
(?<=MESSAGE BEGIN)[sS]+(?=MESSAGE END)
将匹配MESSAGE BEGIN
和MESSAGE END
之间的任何文本(但不包括)。
有关Powershell中支持的常规扩展的讨论,请访问:https://blogs.technet.microsoft.com/heyscriptingguy/2016/10/21/powershell-regex-crash-course-part-4-of-5/
这里的第一部分是使用像[sS]*
这样的模式而不是.
来匹配换行符。您希望匹配惰性+?
/*?
以避免匹配太多(例如,如果有多个消息块,则从第一个消息开始到最后一个消息结束。
模式:
MESSAGE BEGIN([sS]*?)MESSAGE END
或者如果你只是想在内部使用环顾四周(仍然懒惰*?
):
(?<=MESSAGE BEGIN)[sS]*?(?=MESSAGE END)
端到端代码示例:
$text = [IO.File]::ReadAllText(".a.txt")
$matches = [regex]::matches($text, "MESSAGE BEGIN([sS]*?)MESSAGE END");
ForEach($match in $matches) {
#Write-Output $match.Value.Trim(); #if you use look-arounds
Write-Output $match.Groups[1].Value.Trim();
}
MESSAGE BEGIN(s|S)*MESSAGE END
(.*?) 匹配除行终止符之外的所有字符。
\s匹配任何空格字符(等于 [\r\t\f\v ])
\S匹配任何非空格字符(等于 [^\r\t\f\v ])
在捕获组中包括一个条形 | 以匹配 \s 或 \S
然后在捕获组后加一个星号*,以匹配零到无限个字符
链接到示例
我在javascript中创建了一个示例。
const texto = `
MESSAGE BEGIN
mary had a little lamb.
little lamb
MESSAGE END
`
const regex = /MESSAGEsBEGIN[sS]*MESSAGEsEND/gi
console.log(texto.match(regex))
The output is:
[ 'MESSAGE BEGINnnmary had a little lamb.nnlittle lambnnMESSAGE END' ]
隔断线被保留。