2013-08-01 4 views
14

Независимо от того, насколько хорошо я чувствую, что знаю регулярные выражения, они всегда кажутся избитыми.Regex Match any string powershell

Я ищу универсальный шаблон, который будет соответствовать любой строке. Единственный способ узнать, как обрабатывать все эти различные соглашения об именах, - это создать множество различных шаблонов регулярных выражений, и теперь я даже не уверен, что все данные собираются, поэтому мне придется вручную перепроверять Это.

Я просто пытаюсь подобрать что-нибудь, что могло бы быть в двух скобках []:

elseif($line -match "\[\w*\d*\]") {   
    $pars = $matches[0] 
} 
elseif($line -match "\[\d*\w*\]") { 
    $pars = $matches[0] 
} 
elseif($line -match "\[\w*\d*_\w*\]") { 
    $pars = $matches[0] 
} 
elseif($line -match "\[\w*\d*_*\w*-*\w*:*\w*\]") { 
    $pars = $matches[0] 
}    
elseif($line -match "\[\w*_*\w*_*\w*_*\w*_*\w*_*\w*-*\w*\]") { 
    $pars = $matches[0] 
} 

Путь, я делаю это не приводит к возникновению ошибок, но я не уверен, что он обрабатывает все ситуации Я мог бы столкнуться. С этим большим количеством данных проверка вручную практически невозможна.

Кроме того, если кто-нибудь знает о большой полезности для генерации шаблонов регулярных выражений, это было бы очень признательно. Я только смог найти тестеры регулярных выражений, которые мне не очень полезны, и для регулярных выражений с PowerShell мало помогает онлайн.

+4

Что вы имели в виду под любой струной? это означает, что regex '. +' будет делать? и btw, '\ d' и' _' уже включены внутри '\ w' – Angga

+0

Вы не очень хорошо описываете, что именно * точно * вы пытаетесь сопоставить внутри скобок. Из того, что я могу сделать из вашего кода, вы ищете любую строку, которая имеет только буквенно-цифровые символы и символ подчеркивания. Если это так, вы можете просто использовать '\ [[\ d \ w] * \]' или '\ [[a-zA-Z_0-9] * \]' .... О, я вижу двоеточие и тире там тоже. Ну, в этом случае вы можете сделать '\ [[\ w \ d: -] * \]'. –

+0

Ангга получил это на месте. Под любой строкой я имел в виду «Любые возможные символы, которые вы можете разместить между двумя скобками». '. +' Обрабатывает это точно. Спасибо, разместите свое решение, чтобы я мог принять его как ответ. – Cole9350

ответ

17
$a = [regex]"\[(.*)\]" 
$b = $a.Match("sdfqsfsf[fghfdghdfhg]dgsdfg") 
$b.Captures[0].value 
+0

Perfect, Это работает так же хорошо, как '. +', Что оставляет мне понять разницу между жадным и негритянским. Большое спасибо. – Cole9350

+0

Почему бы просто не написать 3 LOC правильно? – 2xMax

+0

Извините, я не понимаю ваш вопрос? – JPBlanc

7

Match все, что не кронштейн. Создать символьный класс, который содержит ничего, кроме символов брекет:

$line -match "\[[^\[\]]+\]" 
2

Сосредоточение на

«Я просто пытаюсь подобрать что-нибудь, что могло бы быть в двух скобках []»

Я думаю, что \[.*\] - это то, что вы ищете.

Объяснение
Sice [ и ] имеют особые цели, так что вы должны использовать \ перед этими символами.
. (точка) обозначает любой символ и
* обозначает любое число повторений предыдущего charector.
Здесь, предыдущий персонаж ., поэтому .* обозначает любую общую строку.