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