带正则表达式的 Powershell:无法在一组数据中查找和替换所有出现的特定字符串
Powershell with regex: Unable to find and replace ALL occurences of specified string in a set of data
我是正则表达式和 Whosebug 的新手。任何帮助将不胜感激。
我正在尝试从数据集中删除不需要的数据。数据包含在具有多个单元格的 .csv 文件列中,每个单元格包含的数据类似于:
OSVDB #109124,OSVDB #109125,OSVDB #109126,OSVDB #109127,OSVDB #109128,OSVDB #109129,OSVDB #109130,OSVDB #109131,OSVDB #109132,OSVDB #109133,OSVDB #109134 #109135,OSVDB #109136,OSVDB #109137,OSVDB #109138,OSVDB #109139,OSVDB #109140,OSVDB #109141,OSVDB #109142,OSVDB #109143,VMSA #2014-0012,OSVDB #102715,OSVDB #109141,OSVDB #109142,OSVDB #102715,OSVDB #104 #106710,OSVDB #115364,IAVA #2014-A-0191,IAVB #2014-B-0160,IAVB #2014-B-0162,IAVB #2015-B-0007
我想用 "IAV..." 开头的字符串每次出现替换上述数据。因此,上面的单元格将显示为:
IAVA #2014-A-0191,IAVB #2014-B-0160,IAVB #2014-B-0162,IAVB #2015-B-0007
下面是导入 .csv 并获取包含数据的列的脚本片段。
我的正则表达式,在 powershell 中是:
$reg1 = ''
$reg2 = '(IAV[A|B]\s#[0-9]{4}-[A|B]-[0-9]{4}){1,}'
ForEach-Object {$_.IAVM = [regex]::replace($_.IAVM,$reg2,$reg1); $_}
结果是:
上面发布了整个单元格内容。
根据我的理解 {1,}
在正则表达式的末尾应该 return 每次出现字符串模式,但我正在 return 包含我的正则表达式的每个单元格的所有内容字符串.
你在正则表达式的开头有 .*
。这将捕获 所有内容,直到它后面的 pat 的最后一个匹配项。就您而言,我认为您无论如何都不需要那部分。
另请注意,PowerShell 有一个方便的 -replace
运算符,因此通常没有理由对 Regex 类型使用静态方法。
也许您只是删除了不需要的内容,而不是试图挑选出您的字符串?尝试类似的东西:
$reg1=''
$reg2='((OSVDB|VMSA)\s#[M-S0-9-]{6,9}[,]?)'
我是正则表达式和 Whosebug 的新手。任何帮助将不胜感激。
我正在尝试从数据集中删除不需要的数据。数据包含在具有多个单元格的 .csv 文件列中,每个单元格包含的数据类似于:
OSVDB #109124,OSVDB #109125,OSVDB #109126,OSVDB #109127,OSVDB #109128,OSVDB #109129,OSVDB #109130,OSVDB #109131,OSVDB #109132,OSVDB #109133,OSVDB #109134 #109135,OSVDB #109136,OSVDB #109137,OSVDB #109138,OSVDB #109139,OSVDB #109140,OSVDB #109141,OSVDB #109142,OSVDB #109143,VMSA #2014-0012,OSVDB #102715,OSVDB #109141,OSVDB #109142,OSVDB #102715,OSVDB #104 #106710,OSVDB #115364,IAVA #2014-A-0191,IAVB #2014-B-0160,IAVB #2014-B-0162,IAVB #2015-B-0007
我想用 "IAV..." 开头的字符串每次出现替换上述数据。因此,上面的单元格将显示为:
IAVA #2014-A-0191,IAVB #2014-B-0160,IAVB #2014-B-0162,IAVB #2015-B-0007
下面是导入 .csv 并获取包含数据的列的脚本片段。 我的正则表达式,在 powershell 中是:
$reg1 = ''
$reg2 = '(IAV[A|B]\s#[0-9]{4}-[A|B]-[0-9]{4}){1,}'
ForEach-Object {$_.IAVM = [regex]::replace($_.IAVM,$reg2,$reg1); $_}
结果是:
上面发布了整个单元格内容。
根据我的理解 {1,}
在正则表达式的末尾应该 return 每次出现字符串模式,但我正在 return 包含我的正则表达式的每个单元格的所有内容字符串.
你在正则表达式的开头有 .*
。这将捕获 所有内容,直到它后面的 pat 的最后一个匹配项。就您而言,我认为您无论如何都不需要那部分。
另请注意,PowerShell 有一个方便的 -replace
运算符,因此通常没有理由对 Regex 类型使用静态方法。
也许您只是删除了不需要的内容,而不是试图挑选出您的字符串?尝试类似的东西:
$reg1=''
$reg2='((OSVDB|VMSA)\s#[M-S0-9-]{6,9}[,]?)'