Группа захвата Powershell Regex не вставляется при замене

у меня есть строка

"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\"

что я пытаюсь вырваться из пространств и превратиться в

"C:\'Program Files (x86)'\'Microsoft Visual Studio 10.0'\Common7\IDE\"

мой код регулярного выражения

"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\" -replace '(?<=\\)(?<loc>.*?\s+.*?)(?=\\)', "'${loc}'"

но почему-то мой выход

"C:\''\''\Common7\IDE\"

любое понимание того, почему это может происходить?


person ChadJPetersen    schedule 30.04.2015    source источник
comment
заменить запасную часть на '$1'   -  person Avinash Raj    schedule 30.04.2015
comment
изменение кода только на -replace '(?‹=\)(?‹loc›.*?\s+.*?)(?=\)', '$1' вставляет правильную замену, но не необходимую ' is есть escape-символ для этого?   -  person ChadJPetersen    schedule 30.04.2015
comment
Вам нужно избежать $ из powershell (чтобы его увидел механизм регулярных выражений). Используйте "'$1'`. Это также работает с вашей первоначальной попыткой именованной группы.   -  person Etan Reisner    schedule 30.04.2015
comment
это работает, также только что обнаружил, что -replace '(?‹=\)(?‹loc›.*?\s+.*?)(?=\)', '''${loc}''' также работает.   -  person ChadJPetersen    schedule 30.04.2015


Ответы (1)


либо

-replace '(?<=\)(?<loc>.*?\s+.*?)(?=\)', '''${loc}'''

or

-replace '(?<=\)(?<loc>.*?\s+.*?)(?=\)', "'$loc'"`

работает

Причина, по которой '''${loc}''' работает, заключается в том, что '' является escape-последовательностью для ' (а не \', как остальные регулярные выражения). причина, по которой "$loc"` работает, заключается в том, что $ необходимо экранировать, чтобы powershell не анализировал его перед передачей в механизм регулярных выражений.

person ChadJPetersen    schedule 30.04.2015
comment
Хотя этот код может решить проблему, несколько пояснений помогут сделать этот ответ ценным для будущих читателей. - person Thom; 30.04.2015
comment
Отличное объяснение. Пожалуйста, опубликуйте его с ответом, чтобы он был понятен будущим читателям. - person Thom; 30.04.2015
comment
Я использую обратную галочку `, чтобы избежать $ при передаче его в механизм регулярных выражений. - person Polyfun; 21.08.2017