2016-10-26 3 views
2

Может ли регулярное выражение находить текст внутри шаблона и разрешать заменять не найденный текст с помощью PowerShell? Так что у меня этот вопрос, где много AssemblyInfo.cs различны по 100+ проектов:Использование регулярного выражения для поиска текста в шаблоне

  • AssemblyCopyright ("Copyright © Моя компания Полное имя Ltd 2016")]
  • AssemblyCopyright ("Copyright © 2016")]
  • AssemblyCopyright («© 2016»)]

возможно ли это, чтобы найти AssemblyCopyright («»)], а затем позвольте мне вставить свой собственный текст, где другой текст был, даже если текст отличается в скобках?

ответ

1

Вы можете использовать это регулярное выражение:

AssemblyCopyright\(".*"\)\] 

И заменить строку вашего выбора:

AssemblyCopyright("The string of your choice")] 
0

Powershell регулярное выражение может быть тревожным из-за многократно иметь дело с экранирующих символов:

Так как вы вложили свою строку между простой цитатой:

  • Групп могут быть маркированы с кронштейном или нет: (.n) или .n
  • двойных кавычек можно рассматривать как стандартные символы
  • Кронштейны можно рассматривать как стандартные символы

Если вы вложенные ваши строка Разногласия между кавычками, двойные кавычки внутри строки должны быть бежать со стандартной PowerShell экранирующего символа: `»

Таким образом, все следующие примеры возвращают тот же результат

$pattern = 'AssemblyCopyright("what ever in there")]' 

# standard regex 
$pattern -replace 'AssemblyCopyright\(\"(.*)\"\)\]', 'AssemblyCopyright("new pattern")]' 
# no quote escape 
$pattern -replace 'AssemblyCopyright\("(.*)"\)\]', 'AssemblyCopyright("new pattern")]' 
# no brackets escape 
$pattern -replace 'AssemblyCopyright\("(.*)"\)]', 'AssemblyCopyright("new pattern")]' 
# no parenthesis to define group 
$pattern -replace 'AssemblyCopyright\(".*"\)]', 'AssemblyCopyright("new pattern")]' 
# double quote instead of simple quote 
$pattern -replace "AssemblyCopyright\(`".*`"\)]", "AssemblyCopyright(`"new pattern`")]" 
0

Пример с более совершенными методами регулярных выражений:

> 'AssemblyCopyright("foo bar")]' -replace '(?<=AssemblyCopyright\(")[^"]*', 'bar' 
AssemblyCopyright("bar")] 
  • (?<=AssemblyCopyright\(") является утверждение, что с просмотром назад соответствует указанному подвыражения, но не делает его часть матча (что пойманные и, в этом случае, заменен).

  • Поскольку утверждение нашло просмотр назад все вплоть до открытия " атрибута, все, что нам нужно, чтобы соответствовать до, но исключая следующий " ([^"]*), чтобы полностью соответствовать только содержимому в двух- (значение атрибута).

  • Таким образом, нам нужно указать только значение значение в качестве замены строки (без цитирования).