Авторизация



Голосование

Помогла ли представленная на сайте информация решению Вашей IT-задачи?
 
Главная страница IT Microsoft POWERSHELL Разбор строки, выборка по условию. PowerShell
Разбор строки, выборка по условию. PowerShell Печать

В этом примере PowerShell я покажу как можно произвести парсинг строки string, не прибегая к регулярным выражениям regex в первом примере и используя их - во втором.

Определим условия задачи

Есть некоторая строка "Something([FindThis(SomethingElse[FindThisToo([]Something)", в которой необходимо найти любые данные, находящиеся между скобками " [ " и " ( ", стоящими в указанной последовательности и исключая сами скобки:

Something([FindThis(SomethingElse[FindThisToo([]Something)

т.е. по сути, нам нужно найти подчеркнутые слова.

Решение без использования регулярных выражений

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

 # Объявили строковую переменную и загнали в нее текст для последующего разбора
[string]$var = 'Something([FindThis(SomethingElse[FindThisToo([]Something)'

Write-Host  
Write-Host 'Original and comments: http://vam.in.ua/index.php/it/25-ms-powershell/152-powershell-parse-string.html'  
Write-Host 'Feedback: http://vam.in.ua/index.php/contacts/2-admins/1-aleksey.html'
Write-Host  

# Удалим используемые переменные для чистоты работы
Remove-Variable first,second -ErrorAction SilentlyContinue

# Устанавливаем переменную для перебора в значение, соответствующее началу строки
$plunk = 0  
# Объявляем переменную конечного результата, пока ничего не содержащую
$result = ''

# Цикл: пока переменная перебора меньше чем длина строки, выполнять блок кода
while ($plunk -lt $var.length) {    
    # Если символ с индексом, равным переменной перебора, соответствует "["
    if ($var[$plunk] -eq '[') {
        # Занесем в переменную first индекс символа "[" для последующей работы
        $first = $plunk
    }
    # Если переменная first определена и символ с индексом, равным переменной перебора, соответствует "("
    if ($first -and ($var[$plunk] -eq '(')) {
        # Занесем в переменную second индекс символа "(" для последующей работы
        $second = $plunk
    }
    # Если определены обе переменные first и second, начинаем выборку нужных нам фрагментов между скобками "[" и "("
    if ($first -and $second) {
        # Увеличим числовую переменную на единицу, т.к. нам нужно исключить скобку "[" из результата
        $first++
        # Выдернем из строковой переменной var все что начинается с индекса first и составляет длину (second минус first). Добавим итог к результирующей переменной
        $result = $result + $var.Substring($first,($second - $first)) + '; '
        # Удалим вспомогательные переменные для того чтобы не выполнялось условие в строке кода под номером 30 до тех пор, пока не будут обнаружены две новые скобки "[" и "("
        Remove-Variable first,second
    }
    # Увеличим числовую переменную на единицу для перебора
    $plunk++    
}

Write-Host ------
# Выводим результат на экран
Write-Host $result

Что в итоге

PS D:\> .\Script.Ps1

------
FindThis; FindThisToo; 

Решение с использованием регулярных выражений

$var = 'Something([FindThis(SomethingElse[FindThisToo([]Something)'
[Regex]::Matches($var,'(?<=\[).*?(?=\()')-join';'

где:

?<=\[ - позитивный просмотр назад

?=\( - позитивный просмотр вперед

).*?( - не жадная или non-greedy выборка (до первого попавшегося условного символа; иначе выберет всё между первым и самым последним условным символом в тексте)

Что в итоге

PS D:\> .\RegEx.Ps1

FindThis;FindThisToo

 
Главная страница IT Microsoft POWERSHELL Разбор строки, выборка по условию. PowerShell