Powershell: Извлечение текста из строки
Как извлечь "имя программы" из строки. Строка будет выглядеть так:
% O0033 (SUB RAD MSD 50R III) G91G1X-6.4Z-2.F500 G3I6.4Z-8. G3I6.4 G3R3.2X6.4F500 G91G0Z5. G91G1X-10.4 G3I10.4 G3R5.2X10.4 G90G0Z2. M99%
Название программы (SUB RAD MSD 50R III). Сохранение результата в другой строке в порядке. Я изучаю powershell, поэтому любое объяснение ваших ответов будет оценено по достоинству.
Ответы
Ответ 1
Следующее regex извлекает что-либо между скобкой:
PS> $prog = [regex]::match($s,'\(([^\)]+)\)').Groups[1].Value
PS> $prog
SUB RAD MSD 50R III
Explanation (created with RegexBuddy)
Match the character '(' literally «\(»
Match the regular expression below and capture its match into backreference number 1 «([^\)]+)»
Match any character that is NOT a ) character «[^\)]+»
Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
Match the character ')' literally «\)»
Проверьте эти ссылки:
http://www.regular-expressions.info
http://powershell.com/cs/blogs/tobias/archive/2011/10/27/regular-expressions-are-your-friend-part-1.aspx
http://powershell.com/cs/blogs/tobias/archive/2011/12/02/regular-expressions-are-your-friend-part-2.aspx
http://powershell.com/cs/blogs/tobias/archive/2011/12/02/regular-expressions-are-your-friend-part-3.aspx
Ответ 2
Если имя программы всегда является первым делом в() и не содержит других), чем тот, который находится в конце, тогда $yourstring -match "[(][^)]+[)]"
результат сопоставления будет в $Matches[0]
Ответ 3
Просто добавьте решение без регулярного выражения:
'(' + $myString.Split('()')[1] + ')'
Это разделяет строку в круглых скобках и берет строку из массива с именем программы в ней.
Если вам не нужны скобки, просто используйте:
$myString.Split('()')[1]
Ответ 4
Использование -replace
$string = '% O0033(SUB RAD MSD 50R III) G91G1X-6.4Z-2.F500 G3I6.4Z-8.G3I6.4 G3R3.2X6.4F500 G91G0Z5. G91G1X-10.4 G3I10.4 G3R5.2X10.4 G90G0Z2. M99 %'
$program = $string -replace '^%\sO\d{4}\((.+?)\).+$','$1'
$program
SUB RAD MSD 50R III