REGEX .net \ powershell строка соответствия между строками - PullRequest
0 голосов
/ 26 апреля 2018

Это может быть очень просто.Я просто хочу сопоставить все строки в строках, включая новые разрывы строк.Пример:

текстовый файл:

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 голосов
/ 26 апреля 2018

Первая часть здесь - использовать шаблон типа [\s\S]* вместо ., чтобы соответствовать символам новой строки.Вы хотите сопоставить lazy +? / *?, чтобы избежать слишком большого совпадения (например, от первого СООБЩЕНИЯ до последнего СООБЩЕНИЯ, если имеется несколько блоков сообщений.)

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();
}
0 голосов
/ 26 апреля 2018

Я создал пример в 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' ]

Разрывы сохранились.

0 голосов
/ 26 апреля 2018

Используйте осмотры:

(?<=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/

0 голосов
/ 26 апреля 2018
MESSAGE BEGIN(\s|\S)*MESSAGE END

(. *?) Соответствует всем символам, , кроме ограничителей строки .

\ s соответствует любому пробелу (равен [\ r\ n \ t \ f \ v])

\ S соответствует любому непробельному символу (равному [^ \ r \ n \ t \ f \ v])

Включить бар |в группе захвата, чтобы соответствовать \ s или \ S

Затем звезда * после группы захвата, чтобы соответствовать нулю неограниченному числу символов

Ссылка на пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...