当前位置: 首页 > 知识库问答 >
问题:

奇怪的powershell行为与脚本块和正则表达式替换

刘俊语
2023-03-14

我正在尝试使用[regex]::用匹配评估器替换来选择性地替换字符串的一部分。我正在PowerShell ISE中编写和调试该函数。奇怪的是,运行替换代码会导致一台机器输出一个字符串,该字符串是匹配评估器脚本块的内容,而另一台机器会正确替换文本。我不知道这是可能的,也不知道为什么会发生这种情况。

给出这段代码(借用另一个stackoverflow的回答):

$global_counter = 0
$callback = {
    $global_counter += 1
    "string-$($args[0])-" + $global_counter
}

$re = [regex]"match"
$re.Replace('zzz match match xxx', $callback)

在一台机器上执行它会导致输出(PowerShell版本5.1.18362.145):

zzz string-match-1 string-match-1 xxx

但在另一个页面上,它输出(PowerShell 版本 5.1.17134.858):

zzz
    $global_counter += 1
    "string-$($args[0])-" + $global_counter

    $global_counter += 1
    "string-$($args[0])-" + $global_counter
 xxx

它们都是直接从重新启动运行在x64 PowerShell ISE clean实例中。有人知道为什么会这样吗?

共有1个答案

万俟嘉珍
2023-03-14

在Jeroen的调试帮助下,我设法找出了为什么会发生这种情况。

PowerShell有一个名为“受限语言模式”的安全功能,可以防止使用除核心白名单类型之外的任何类型。似乎正在发生的是,我正在定义一个脚本块,该脚本块依次转换为<code>System.Text.RegularExpressions。MatchEvaluator在传递到<code>替换Replace函数完成了它的工作,但使用常规字符串作为替换,因此导致了异常行为。

我无法在我当前使用的机器上更改PowerShell会话的语言模式,因为它是通过组策略应用的,但至少对我来说,一种解决方法是使用提升的PowerShell会话和ISE来测试我的脚本。

 类似资料:
  • 问题内容: 关于正则表达式有一个问题,试图回答我发现了另一个奇怪的事情。 这将打印YY。为什么?? 这会打印YXY 为什么勉强的正则表达式与“ X”字符不匹配?有,但为什么第一次不匹配三个符号和匹配的是两个,然后一个而不是三个?和第二个正则表达式仅匹配s而不匹配? 问题答案: 让我们依次考虑它们: 有两个匹配项: 在字符位置0处被匹配,并被替换为。 在字符位置1,空字符串被匹配,并被添加到输出中。

  • 我使用BufferedReader读取了一个txt文件。我将每一行添加到一个长字符串中,并将前面发布的代码应用于此。整个代码如下: 文本文件是一篇我想删除不是字母的所有内容(包括空白空间)的普通文章。摘录如下:“[16]自由软件基金会(FSF)成立于1985年,其本意是”自由“一词指的是发行的自由。”

  • 我正在处理一个大的csv文件,其中的字段用双引号括起来,其中的文本描述包含未替换的双引号,我需要用转义的双引号替换。我尝试过使用以下正则表达式:

  • 下面就来详细介绍Notepad++中关于正则表达式的部分,主要是查找和替换。 对于替换功能,一般的文本编辑器,都具有此功能,但是对于高级的正则表达式替换,则很多都不支持。而此处Notepad++支持此功能。 正则表达式的替换,在很长一段时间内,我都没有用到过。而后来有此需求的时候,由于不熟悉,导致也没去折腾具体如何使用的。 后来有空去弄了下,终于搞懂了。对此类功能不了解的人,会没啥感觉,但是看了下

  • 有没有人试图描述与正则表达式匹配的正则表达式? 由于重复的关键字,这个主题几乎不可能在网上找到。 它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。 但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

  • 而不是显示“diserahkan”,其结果是“diserahkannya”。因此,在尝试替换操作时,并不满足所有条件。为什么会这样?Im使用Java并使用Matcher中的replaceAll方法