使用正则表达式查找模式中的文本

Use Regular Expression to find text within a pattern

正则表达式能否找到模式中的文本并允许我用 PowerShell 替换未找到的文本? 所以我有这个问题,其中许多 AssemblyInfo.CS 在 100 多个项目中是不同的:

它是否可以找到 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 作为替换字符串(无引号)。