REGEX .net\powershell 匹配字符串之间的字符串



这可能很简单。我只想匹配字符串中的所有字符串,包括新的换行符。 例:

文本文件:

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 BEGINMESSAGE 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' ]

隔断线被保留。

最新更新