Powershell regex выберите часть строки - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть строка, которая меняется

BLUE ORIGIN             CONTACT:  MB

Первая часть - это то, что меняется, это в основном имя клиента.Таким образом, количество символов и пробелов будет меняться.

Я знаю, что могу использовать это, и оно будет соответствовать тому, что мне нужно

$String = 'BLUE ORIGIN             CONTACT:  MB'
$string -match '(^\S+\s+\S+)(\s+)(CONTACT:)(\s+)(\S+)'
$Matches[1]

Но если строка изменится на что-то вроде этого, без пробелов

CUSTOMERNAME            CONTACT:  MB

-match имеет значение false.

Как я могу сделать регулярное выражение, которое захватывает первую часть строки независимо от ее длины или символов?

Возможно, это не было супер ясно.Значения, которые мне нужны, следующие:

$Matches[1] - в приведенном выше тексте будет СИНИЙ ОРИГИН

$Matches[3] - КОНТАКТ:

$Matches[5] - МБ

Ответы [ 4 ]

0 голосов
/ 13 декабря 2018

Вы IMO слишком усложняете вещи.
Размещая скобки для групп захвата, вы решаете, что захватывать.

$String = 'BLUE ORIGIN             CONTACT:  MB'
$string -match '^(.*?)\s+(CONTACT:)\s+(\S+)' | Out-Null
$matches | ft -AutoSize

Name Value
---- -----
3    MB
2    CONTACT:
1    BLUE ORIGIN
0    BLUE ORIGIN             CONTACT:  MB

$string = "CUSTOMERNAME            CONTACT:  MB"
$string -match '^(.*?)\s*(CONTACT:)\s+(\S+)'|Out-Null
$matches | ft -AutoSize

Name Value
---- -----
3    MB
2    CONTACT:
1    CUSTOMERNAME
0    CUSTOMERNAME            CONTACT:  MB
0 голосов
/ 13 декабря 2018

Согласно предоставленным данным, это сделает работу за вас

[A-Za-z\s]+CONTACT:\s+\S+

Объяснение

  • [A-Za-z\s]+ - соответствует любомуалфавит или пробел один или несколько раз.
  • CONTACT: - соответствует CONTACT:.
  • \s+ - соответствует одному или нескольким пробелам.
  • \S+ -Соответствует одному или нескольким непробельным символам.

Демо

0 голосов
/ 13 декабря 2018

Чтобы ваше регулярное выражение работало для обоих примеров, вы можете изменить (^\S+\s+\S+) на (^\S+\s*\S+), чтобы символ пробела \s* соответствовал 0+ раз вместо 1+ раз.

(^\S+\s*\S+)(\s+)(CONTACT:)(\s+)(\S+)
.......^

Regex demo

Вы можете опустить группу захвата около (\s+) и просто сопоставить \s+, если вы больше не обращаетесь к ней в своем инструменте или коде.

0 голосов
/ 13 декабря 2018

Механизмы регулярных выражений обычно поддерживают частичное совпадение строк.Не пытайтесь сопоставить все вещи до CONTACT:

$s = 'BLUE ORIGIN             CONTACT:  MB'
$s -match 'CONTACT:\s+(\S+)'
$Matches

Вывод:

Name                           Value
----                           -----
1                              MB
0                              CONTACT:  MB

(так что вы можете просто сделать $Matches[1], чтобы получить только значение, которое выпосле.)

Если вам нужно разбить всю строку на несколько элементов данных, а не только на этот, я не думаю, что я бы использовал регулярные выражения.Я хотел бы изучить разработку синтаксического анализатора.Однако делать это в PowerShell, вероятно, неуместно. Здесь - некоторые инструменты .NET, которые могут помочь с этим.

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