none
Парсинг строк в PowerShell, выборка по условию RRS feed

  • Вопрос

  • Доброго всем!

    Понадобилось мне найти внутри строки текст, находящийся между двумя скобками. Решил написать для этой цели такой вот скрипт. Я пока только втягиваюсь в кодинг на PS, поэтому с удовольствием приму замечания по оптимизации. Например вопрос: можно ли сделать выборку, которая заключена в строки кода под номерами 36-41, не прибегая к данному циклу (зная первый и последний индексы char вытянуть все что между ними)?

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

    Заранее благодарен!


    IT notes:

    http://Vam.in.UA

    21 декабря 2012 г. 22:28

Ответы

  • Я пока только втягиваюсь в кодинг на PS, поэтому с удовольствием приму замечания по оптимизации. Например вопрос: можно ли сделать выборку, которая заключена в строки кода под номерами 36-41, не прибегая к данному циклу (зная первый и последний индексы char вытянуть все что между ними)?
    У строк есть метод Substring, позволяющий выделять подстроку по первому символу и длине, также для поиска символа в строке можно использовать IndexOf.
    Также хотелось бы узнать аналогичное решение с помощью регулярных выражений, если возможно.
    $var = 'Something([FindThis(SomethingElse[FindThisToo([]Something)'
    [Regex]::Matches($var,'(?<=\[).*?(?=\()')-join';'


    • Изменено PetSerAl 22 декабря 2012 г. 8:58
    • Помечено в качестве ответа Dev_LC 22 декабря 2012 г. 20:58
    22 декабря 2012 г. 8:35

Все ответы

  • Я пока только втягиваюсь в кодинг на PS, поэтому с удовольствием приму замечания по оптимизации. Например вопрос: можно ли сделать выборку, которая заключена в строки кода под номерами 36-41, не прибегая к данному циклу (зная первый и последний индексы char вытянуть все что между ними)?
    У строк есть метод Substring, позволяющий выделять подстроку по первому символу и длине, также для поиска символа в строке можно использовать IndexOf.
    Также хотелось бы узнать аналогичное решение с помощью регулярных выражений, если возможно.
    $var = 'Something([FindThis(SomethingElse[FindThisToo([]Something)'
    [Regex]::Matches($var,'(?<=\[).*?(?=\()')-join';'


    • Изменено PetSerAl 22 декабря 2012 г. 8:58
    • Помечено в качестве ответа Dev_LC 22 декабря 2012 г. 20:58
    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
  • Спасибо, то что надо!

    IT notes:

    http://Vam.in.UA

    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.UA

    27 декабря 2012 г. 7:02