好的..。经过99个不同的组合..。
我想把数千个文件中的所有EnumMessage.something替换成EnumMessage.SOMETHING,所以大写的第二个词。它可以是独立的,也可以后面是点,或者后面是(
$output = 'EnumMessage.test(something) and EnumMessage.Tezt andz EnumMessage.ALREAdY. ' -creplace 'EnumMessage\.(\w+)', 'EnumMessage.$1.ToUpper()'
$output因此,上面把函数放在上面(单词),但它没有放在第二个单词的上方。
发布于 2021-04-20 19:13:57
在PowerShell 6和更高版本中,-replace操作符也接受执行替换操作的脚本块。。脚本块为每次匹配运行一次。
在PowerShell 5中,应用方法。
$string = 'EnumMessage.test(something) and EnumMessage.Tezt andz EnumMessage.ALREAdY. '
$pattern = '(?<=EnumMessage\.)(\w+)'
# (?<=EnumMessage\.) = positive lookbehind
if ( $PSVersionTable.PSVersion.Major -ge 6 ) {
$string -replace $pattern, { $_.Value.ToUpper() }
} else {
[regex]::Replace( $string, $pattern, { $args.Value.ToUpper() } )
}发布于 2021-04-20 19:09:54
肯定有一些挑战。我在RegEx真的不是最好的。每当我试图利用$matches集合时,我都只能替换第一个匹配项。关于这个功能我可能忘了一些东西。然而,我却能做出以下几点:
[RegEx]::Matches($String, '(?<=EnumMessage\.)\w+') |
ForEach-Object{
$Replace = $String.Substring($_.Index, $_.Length).ToUpper()
$String = $String.Remove($_.Index, $_.Length)
$String = $String.Insert($_.Index, $Replace)
}
$String注意:我使用了RegEx查找,但我不确定,这与结果有很大关系。
.Net [RegEx]类返回对象,其中包含字符串中匹配的位置,因此我使用该对象来战略性地删除,然后添加被大写的字符串。哪个应该返回:EnumMessage.TEST(something) and EnumMessage.TEZT andz EnumMessage.ALREADY.
https://stackoverflow.com/questions/67183335
复制相似问题