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

时间:2018-04-26 02:26:15

标签: regex powershell

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

文本文件:

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

我希望它尊重换行符,以便它们不会全都塞满。

4 个答案:

答案 0 :(得分:1)

使用环顾四周:

(?<=MESSAGE BEGIN)[\s\S]+(?=MESSAGE END)

将匹配(但不包括)MESSAGE BEGINMESSAGE 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。)

Pattern

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

然后在捕获组之后的一个星*匹配零到无限字符

Link to example

答案 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' ]

保留了分隔线。