Лучший отвечающий
Парсинг строк в PowerShell, выборка по условию

Вопрос
-
Доброго всем!
Понадобилось мне найти внутри строки текст, находящийся между двумя скобками. Решил написать для этой цели такой вот скрипт. Я пока только втягиваюсь в кодинг на PS, поэтому с удовольствием приму замечания по оптимизации. Например вопрос: можно ли сделать выборку, которая заключена в строки кода под номерами 36-41, не прибегая к данному циклу (зная первый и последний индексы char вытянуть все что между ними)?
Также хотелось бы узнать аналогичное решение с помощью регулярных выражений, если возможно.
IT notes:
http://Vam.in.UA21 декабря 2012 г. 22:28
Ответы
-
Я пока только втягиваюсь в кодинг на PS, поэтому с удовольствием приму замечания по оптимизации. Например вопрос: можно ли сделать выборку, которая заключена в строки кода под номерами 36-41, не прибегая к данному циклу (зная первый и последний индексы char вытянуть все что между ними)?
У строк есть метод Substring, позволяющий выделять подстроку по первому символу и длине, также для поиска символа в строке можно использовать IndexOf.Также хотелось бы узнать аналогичное решение с помощью регулярных выражений, если возможно.
$var = 'Something([FindThis(SomethingElse[FindThisToo([]Something)' [Regex]::Matches($var,'(?<=\[).*?(?=\()')-join';'
22 декабря 2012 г. 8:35
Все ответы
-
Я пока только втягиваюсь в кодинг на PS, поэтому с удовольствием приму замечания по оптимизации. Например вопрос: можно ли сделать выборку, которая заключена в строки кода под номерами 36-41, не прибегая к данному циклу (зная первый и последний индексы char вытянуть все что между ними)?
У строк есть метод Substring, позволяющий выделять подстроку по первому символу и длине, также для поиска символа в строке можно использовать IndexOf.Также хотелось бы узнать аналогичное решение с помощью регулярных выражений, если возможно.
$var = 'Something([FindThis(SomethingElse[FindThisToo([]Something)' [Regex]::Matches($var,'(?<=\[).*?(?=\()')-join';'
22 декабря 2012 г. 8:35 -
$string = "Abcd (XYZ). Qwerty (asdf(lalala))"
Простейший способ: оператор -match. Круглые скобки - это служебные символы, поэтому в выражении маскируем их слэшем"\("
$string -match "\((.+)\)";$matches True Name Value ---- ----- 1 XYZ). Qwerty (asdf(lalala) 0 (XYZ). Qwerty (asdf(lalala))
$matches - это массив из двух строк. Первая - все что получено посредством (.+). Вторая - то же самое, но с обрамляющими скобками.
$matches[1] XYZ). Qwerty (asdf(lalala)
Теперь "нежадный вариант"
$string -match "\((.+?)\)";$matches True Name Value ---- ----- 1 XYZ 0 (XYZ) $matches[1] XYZ
Указав символ "?", мы получили минимальное совпадение.
Второй способ работы с регулярными выражениями. Аналогично, "жадный" и "нежадный" варианты.
$regex = [regex]"\((.+)\)" $regex.match($string).Groups[1].value XYZ). Qwerty (asdf(lalala) $regex = [regex]"\((.+?)\)" $regex.match($string).Groups[1].value XYZ
Более подробно, например, здесь:
http://itband.ru/2010/05/regular-expressions-windows-powershell/
http://xaegr.wordpress.com/2010/04/09/regexp-8-regex/MCITP:SA, MCTS:Exchange Configuring
22 декабря 2012 г. 9:52 -
22 декабря 2012 г. 21:14
-
И снова 5 копеек добавлю (а вдруг вы еще не знаете? ;)): У Василия Гусева есть замечательная серия статей по работе с regexp'ами в powershell
http://xaegr.wordpress.com/category/regular-expressions/
my blog: http://shserg.ru/
26 декабря 2012 г. 14:13 -
И снова 5 копеек добавлю (а вдруг вы еще не знаете? ;)): У Василия Гусева есть замечательная серия статей по работе с regexp'ами в powershell
http://xaegr.wordpress.com/category/regular-expressions/
my blog: http://shserg.ru/
IT notes:
http://Vam.in.UA27 декабря 2012 г. 7:02