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