Regex 如何在正则表达式替换中将正则表达式令牌传递给PowerShell子表达式?
我有以下代码:-Regex 如何在正则表达式替换中将正则表达式令牌传递给PowerShell子表达式?,regex,powershell,token,expandable,Regex,Powershell,Token,Expandable,我有以下代码:- '\u0026' -replace '(\u)(\d{4})', '$$([char]0x$2)' 这显然将导致:- $([char]0x0026) 如果我使用以下命令将正则表达式替换为可扩展字符串:- '\u0026' -replace '(\\u)(\d{4})', "$([char]0x`${2})" 然后我会得到:- 表达式或语句中出现意外标记“0x`$” 如果我将事情简化为:- '\u0026' -replace '(\\u)(\d{4})',
'\u0026' -replace '(\u)(\d{4})', '$$([char]0x$2)'
这显然将导致:-
$([char]0x0026)
如果我使用以下命令将正则表达式替换为可扩展字符串:-
'\u0026' -replace '(\\u)(\d{4})', "$([char]0x`${2})"
然后我会得到:-
表达式或语句中出现意外标记“0x`$”
如果我将事情简化为:-
'\u0026' -replace '(\\u)(\d{4})', "0x`${2}"
然后我可以得到:-
0x0026
但是,我想要的是将“0x0026”强制转换为一个char,以便将“\u0026”替换为“&”。但是,似乎不可能以这种方式将正则表达式替换的令牌传递给PowerShell子表达式。如果您使用以下命令分隔两种语言:-
'\u0026' -replace '(\\u)(\d{4})', "$([char]0x0026) 0x`${2}"
然后将产生以下结果:-
&0x0026
这很好,因为它显示了PowerShell子表达式在正则表达式替换中确实可以工作,正如转换的“与”所示
我对RegEx不熟悉。我已经达到极限了吗?使用脚本块替换(6.2及更高版本): 在早期版本的PowerShell中,您可以通过调用
[Regex]::Replace()
:
在这两种情况下,块将作为每个匹配的回调函数,允许您在访问匹配的子字符串后但在替换发生之前构造替换字符串:
PS ~> [regex]::Replace('\u0026', '(\\u)(\d{4})', {param($m) "0x$($m.Groups[2].Value)"})
0x0026
powershell 7中有一种方法,其中-replace的第二个参数可以是一个脚本块。使用
$获取第二个匹配组需要更多的工作:
'\u0026' -replace '(\\u)(\d{4})', { $b = $_ }
$b.groups
Groups : {0, 1, 2}
Success : True
Name : 0
Captures : {0}
Index : 0
Length : 6
Value : \u0026
Success : True
Name : 1
Captures : {1}
Index : 0
Length : 2
Value : \u
Success : True
Name : 2
Captures : {2}
Index : 2
Length : 4
Value : 0026
'\u0026' -replace '(\\u)(\d{4})', { [char][int]('0x' + $_.groups[2]) }
&
请注意,\d
不会匹配所有十六进制数。([:xdigit:]
不起作用。)
显然,您希望取消转义正则表达式的转义。您可以使用.net[regex]
方法执行此操作:
收益率:
Jack&Jill
也许你应该解释你想做什么,而不是怎么做。(请参阅:)啊,那么您正试图修改文件中的HTML源代码?你能在问题中包含这样一个文件的样本吗?我完全同意@Tomalak的观点,提出的问题是一个简单的问题。要摆脱这个XY
循环,请问自己为什么???(问题中的每个定义是什么)?As:为什么要“&0x0026
”?(并将该信息添加到问题中)。我想你只是想这么做:[Regex]::Unescape('Jack\u0026Jill')
。但即使是这个答案也有疑问,因为它通常不需要一个规范的表达……我们仍然没有解决你的实际问题,而仅仅是它的症状。没有理由认为\u0026
甚至是HTML格式的,除非在生成HTML时出现问题(那么这应该得到修复),或者是JSON字符串格式的(那么应该使用JSON解析器)。通过正则表达式替换这些转义序列是可能的,但它看起来根本不像你真正需要的东西。@Tomalak-你是对的,将来也不会有任何计划来修复它,但这不是我的事。内联网页面是Sharepoint页面,我在某处读到,某些字符将以这种方式转义。很抱歉没有正确解释背景场景,但我真的很感谢大家在这方面的投入。作为我在这个网站上的第一次行动,我将学习我的错误,下次会更清楚。
'\u0026' -replace '(\\u)(\d{4})', { $b = $_ }
$b.groups
Groups : {0, 1, 2}
Success : True
Name : 0
Captures : {0}
Index : 0
Length : 6
Value : \u0026
Success : True
Name : 1
Captures : {1}
Index : 0
Length : 2
Value : \u
Success : True
Name : 2
Captures : {2}
Index : 2
Length : 4
Value : 0026
'\u0026' -replace '(\\u)(\d{4})', { [char][int]('0x' + $_.groups[2]) }
&
'\u002b' -replace '(\\u)([0-9a-f]{4})', { [char][int]('0x' + $_.groups[2]) }
+
[Regex]::Unescape('Jack\u0026Jill')
Jack&Jill