2015-04-30 3 views
0

У меня есть строка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\" 

любое понимание того, почему это может произойти?

+0

изменение замена части в ' '$ 1'' –

+0

изменения кода только -replace '(? <=\\)(?. *? \ S +. *?) (? = \\)', '$ 1' ставит правильный замена, но не необходимый "есть ли для этого символ побега? – ChadJPetersen

+1

Вам нужно избегать '$' из powershell (поэтому движок регулярных выражений видит это). Используйте '' '' $ 1 '"'. Это также работает с вашей первоначальной попыткой названной группы. –

ответ

4

либо

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

или

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

работы

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

+0

Хотя этот код может решить проблему, несколько объяснений объяснят долгий путь, чтобы сделать этот ответ ценным для будущих читателей. – Thom

+0

@ TheThom True, отредактированный для отражения – ChadJPetersen

+0

Отличное объяснение. Пожалуйста, опубликуйте его с ответом, чтобы читателям было ясно. – Thom

Смежные вопросы