PowerShell Regex игнорировать до совпадения символьной строки, включая совпадение строки - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь прочитать файл и игнорировать все до совпадения символов. Иногда совпадение символов будет отображаться в той же строке с нужными мне результатами, поэтому я не могу указать Select-Object -Skip x, где x - количество строк, возвращаемых из документа.

Я пытался используйте метод .Split('<pre>') для результатов, и это сработало, но я не могу выбрать индекс, потому что это возвращенная многострочная строка.

Ниже приводится начало примера возврата текста. Это ответ HTML, из которого я пытаюсь прочитать данные. Я не могу использовать Content, так как он находится в ByteArray и имеет пробел между каждым символом. Итак, я пришел к выводу, что пришло время попросить помощи с [Regex] в PowerShell.

Я смотрел этот ответ и подумал, что могу использовать /.+?(?=abc)/, заменив строка поиска выглядит так:

(Get-Content $env:TEMP\test.txt) | ForEach-Object { 
    [Regex]::Match($_, "^.+(?=\<pre\>)").Value
}

Это тоже не сработало. Я в порядке с регулярным выражением, когда ищу совпадение типа {\d\d\d}, чтобы гарантировать, что оно состоит из 3 цифр, но я не уверен, как его использовать в этом случае.

Это начало возвращаемого файла . Мне нужно игнорировать все, вплоть до символов <pre>, а затем все, что после этого до конца файла в порядке.

Пример команды и результат, возвращаемый здесь:

PS> Get-Content $env:TEMP\test.txt

HTTP/1.1 200 OK
Content-Length: 3524
Date: Thu, 18 Jun 2020 15:00:05 GMT
Last-Modified: Fri, 19 Jun 2020 01:00:05 GMT
Server: TTWS/1.2 on Microsoft-HTTPAPI/2.0

<!doctype html><html><body>
    <p>Test TCP WebServer 1.2</p>
    <pre>

    Directory: C:\tmp

EDIT:

Теперь у меня есть это, которое удаляет все, включая первый тег <pre>, а также удаляет закрывающий тег </pre>, но не удаляет ничего ПОСЛЕ закрывающего тега </pre> .

(Get-Content $env:TEMP\test.txt -Raw) -replace '(?s)^.*?<pre>' -replace '<\/pre>(.+?)'

Можно ли его развернуть, чтобы включить в конец файла?

1 Ответ

1 голос
/ 19 июня 2020

Шаблон .+? «ленивый», нежадный. Это означает, что он будет соответствовать наименьшему количеству символов, которое ему разрешено соответствовать. Поскольку в конце шаблона указано .+?, а .+? соответствует 1 или более символам, он будет соответствовать одному символу и завершится. Вам понадобится жадный квантификатор , * или +.

Кроме того, вы можете достичь того, что вам нужно, с помощью одной команды -replace, если вы используете группу захвата.

Вам нужно использовать

<code>(Get-Content $env:TEMP\test.txt -Raw) -replace '(?s)^.*?<pre>(.*?)
. * ',' $ 1 '

Это займет все содержимое файла и получит текстовое содержимое между первой строкой <pre> и ближайший </pre>.

Детали шаблона

  • (?s) - a RegexOptions.Singleline создание встроенного модификатора . также соответствует новым строкам
  • ^ - начало строки
  • .*? - любой ноль или более символов как можно меньше
  • <pre> - a <pre> текст
  • (.*?) - группа захвата # 1: любой ноль или более символов как можно меньше
  • </pre> - </pre> текст
  • .* - любой ноль или более символов столько же насколько это возможно (поскольку * является жадным квантификатором).

$1 в шаблоне замены восстановит значение Группы 1 в результате (так что оно останется).

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