Соответствие регулярному выражению для извлечения данных между первым (и последним), если данные содержат скобки? - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь извлечь данные из строки текста, используя Powershell.Данные, которые мне нужны, находятся между первой и последней скобкой.То, что у меня есть, похоже, работает, но не работает, если сами данные содержат закрывающую скобку ...

$MyText = "BT /F3 8.999 Tf 0 0 0 rg 407.446 TL 64.368 772.194 Td (\(TESTJulia\)  Julia's Test Company) Tj T* ET"
[regex]::match($MyText,'(?<=\().+?(?=\))')

Ответы [ 3 ]

0 голосов
/ 12 апреля 2019

вот немного другой способ добраться туда ... [ ухмылка ]

это зависит от того, всегда ли td ( и ) tj присутствуют, но это работает с вашими примерами данных

$InStuff = "BT /F3 8.999 Tf 0 0 0 rg 407.446 TL 64.368 772.194 Td (\(TESTJulia\)  Julia's Test Company) Tj T* ET"

$InStuff -match 'td \((.+)\) tj .+$'

$Matches[1]

вывод ...

\(TESTJulia\)  Julia's Test Company
0 голосов
/ 12 апреля 2019

Почему бы не удалить ленивый квантификатор?Это сделает его жадным, так что он захватит столько символов, сколько сможет, пока не достигнет предвкушения.

PS>$MyText = "BT /F3 8.999 Tf 0 0 0 rg 407.446 TL 64.368 772.194 Td (\(TESTJulia\)  Julia's Test Company) Tj T* ET"
PS>[regex]::match($MyText,'(?<=\().+(?=\))')

Groups   : {0}
Success  : True
Name     : 0
Captures : {0}
Index    : 55
Length   : 35
Value    : \(TESTJulia\)  Julia's Test Company
0 голосов
/ 12 апреля 2019

Это то, что вы хотите?

$MyText = "BT /F3 8.999 Tf 0 0 0 rg 407.446 TL 64.368 772.194 Td (\(TESTJulia\)  Julia's Test Company) Tj T* ET"
$match = [regex]::Match($MyText,'\(+?(.*)\)')
Write-Host $match.Captures.groups[1].value

Выход:

\(TESTJulia\)  Julia's Test Company

Объяснение Regex (любезно предоставлено Regex101.com):

\(+? matches the character ( literally (case sensitive)
+? Quantifier — Matches between one and unlimited times, as few times as possible, expanding as needed (lazy)
1st Capturing Group (.*)
.* matches any character (except for line terminators)
* Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
\) matches the character ) literally (case sensitive)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...