【问题标题】:How can I use this regex string in powershell?如何在 powershell 中使用这个正则表达式字符串?
【发布时间】:2017-07-07 12:27:04
【问题描述】:

我有一个相当简单的 PowerShell 脚本,由于其中的 RegEx,我无法开始工作。在 Notepad++ 中运行良好的 RegEx 是

查找:^(?!7725_1|\"Dealer).*\r\n

替换:

这将删除所有不以“7725_1”或“Dealer”开头的行。

我尝试了以下 Powershell 脚本的许多不同版本,包括使用“`”转义所有正则表达式字符并使用 [Regex]::Replace 函数。到目前为止,我能推断出的只是我做错了什么——我就是不知道是什么。

    (GC C:\Users\Bdraper\Desktop\Redrop1.csv) -Replace "^(?!7725_1|\"Dealer).*$\r\n",""|out-file -encoding ASCII C:\Users\Bdraper\Desktop\Redrop2.csv

感谢您提供的任何帮助!

【问题讨论】:

  • ? { $_.StartsWith('7725_1') -or $_.StartsWith('"Dealer') }

标签: regex powershell replace


【解决方案1】:

有几件事可能会导致这个问题。

首先要知道的是,您使用的是gc (Get-Content),它返回一个行数组。这意味着-replace 运算符正在对一个数组进行操作,并将返回一个包含替换的数组。

因为Get-Content 返回行,任何 CR 的 LF 字符都不会出现,因此您的正则表达式可能永远不会匹配。这也意味着你会得到那些做的空行,可能不是你想要的。

利用这些知识更容易做的事情是使用-match 运算符,这将简化您的正则表达式和整个过程:

(GC C:\Users\Bdraper\Desktop\Redrop1.csv) -match '^(7725_1|"Dealer)'| 
    out-file -encoding ASCII C:\Users\Bdraper\Desktop\Redrop2.csv

所以基本上,“给我所有以这些字符串开头的行”,然后你只需将它们写到文件中。

【讨论】:

  • 这很好用,而且比我尝试做的要简单得多。非常感谢您的帮助!!当我尝试将 regex 的粗略知识与 powershell 的粗略知识结合起来时,这就是我得到的。
【解决方案2】:

您的正则表达式将不匹配,因为您没有使用允许您使用正则表达式跨越多行的量词。此外,您的字符串实际上是一个数组,-replace 愿意使用但不是您期望的方式。您的引号和换行符也不正确,因为在 PowerShell 中转义使用反引号。继续前进

这将删除所有不以“7725_1”或“Dealer”开头的行。

为什么不直接用-match 过滤掉那些呢

(GC C:\Users\Bdraper\Desktop\Redrop1.csv) -match "^(7725_1|`"Dealer)" | 
    Set-Content C:\Users\Bdraper\Desktop\Redrop2.csv

因此这将只允许以 7725_1 或“经销商”开头的项目进入输出文件。Set-Content 通常比Out-File 快,并且默认为 ASCII 编码。

【讨论】:

    猜你喜欢
    • 2011-06-11
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2021-01-15
    • 1970-01-01
    • 2013-11-19
    • 2015-03-05
    相关资源
    最近更新 更多