使用正则表达式查找模式中的文本
Use Regular Expression to find text within a pattern
正则表达式能否找到模式中的文本并允许我用 PowerShell 替换未找到的文本?
所以我有这个问题,其中许多 AssemblyInfo.CS 在 100 多个项目中是不同的:
- 程序集版权("Copyright © My Company Full Name Ltd 2016")]
- 程序集版权("Copyright © 2016")]
- AssemblyCopyright("© 2016")]
它是否可以找到 AssemblyCopyright("")] 然后允许我将自己的文本插入到其他文本所在的位置,即使括号内的文本不同?
您可以使用这个正则表达式:
AssemblyCopyright\(".*"\)\]
并替换为您选择的字符串:
AssemblyCopyright("The string of your choice")]
Powershell 正则表达式可能令人不安,因为有多种处理转义字符的方法:
因此,当您将字符串嵌套在简单引号之间时:
- 组可以用括号标记也可以不用: (.n) 或 .n
- 双引号可视为标准字符
- 中括号可视为标准字符
如果您将字符串嵌套在双引号之间,则字符串中的双引号必须使用标准的 powershell 转义字符进行转义:`"
因此以下所有示例 return 结果相同
$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`")]"
使用更高级的正则表达式技术的示例:
> 'AssemblyCopyright("foo bar")]' -replace '(?<=AssemblyCopyright\(")[^"]*', 'bar'
AssemblyCopyright("bar")]
(?<=AssemblyCopyright\(")
是匹配指定子表达式的后向断言,但不会使其成为匹配的一部分(captured 和,在这种情况下,替换了).
因为lookbehind assertion找到了属性的开始"
之前的所有内容,我们需要的只是匹配但不包括下一个"
([^"]*
) 以仅完全匹配双引号字符串(属性值)的 内容。
因此,我们只需要指定属性 value 作为替换字符串(无引号)。
正则表达式能否找到模式中的文本并允许我用 PowerShell 替换未找到的文本? 所以我有这个问题,其中许多 AssemblyInfo.CS 在 100 多个项目中是不同的:
- 程序集版权("Copyright © My Company Full Name Ltd 2016")]
- 程序集版权("Copyright © 2016")]
- AssemblyCopyright("© 2016")]
它是否可以找到 AssemblyCopyright("")] 然后允许我将自己的文本插入到其他文本所在的位置,即使括号内的文本不同?
您可以使用这个正则表达式:
AssemblyCopyright\(".*"\)\]
并替换为您选择的字符串:
AssemblyCopyright("The string of your choice")]
Powershell 正则表达式可能令人不安,因为有多种处理转义字符的方法:
因此,当您将字符串嵌套在简单引号之间时:
- 组可以用括号标记也可以不用: (.n) 或 .n
- 双引号可视为标准字符
- 中括号可视为标准字符
如果您将字符串嵌套在双引号之间,则字符串中的双引号必须使用标准的 powershell 转义字符进行转义:`"
因此以下所有示例 return 结果相同
$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`")]"
使用更高级的正则表达式技术的示例:
> 'AssemblyCopyright("foo bar")]' -replace '(?<=AssemblyCopyright\(")[^"]*', 'bar'
AssemblyCopyright("bar")]
(?<=AssemblyCopyright\(")
是匹配指定子表达式的后向断言,但不会使其成为匹配的一部分(captured 和,在这种情况下,替换了).因为lookbehind assertion找到了属性的开始
"
之前的所有内容,我们需要的只是匹配但不包括下一个"
([^"]*
) 以仅完全匹配双引号字符串(属性值)的 内容。因此,我们只需要指定属性 value 作为替换字符串(无引号)。