powershell Regex -在CSV文件中搜索第n个逗号后的字符串

ffscu2ro  于 2023-08-05  发布在  Shell
关注(0)|答案(4)|浏览(151)

我在办公室接手了一个项目,我似乎找不到答案。我试图写一个Powershell脚本使用Regex来替换文本在特定领域的多行逗号分隔CSV文件,但我替换的文本可能存在于其他领域。
例如,在以下数据中:

Smith,Robert,W,11111 N 400 W,Some City,Some State,Some Zip

字符串
我需要将第四列中的W替换为West,但我不希望第三列(或其他列)中的W被更改。至少,我可以让它搜索第n个逗号之后的任何匹配项,因为街道地址后面的字段大多是数字,但理想情况下,最好只搜索特定的列,以防将来在其他地方有匹配的文本。
我已经找到了一些提示和正则表达式脚本,似乎让我接近,但我挣扎着让它工作测试它与记事本++。有些脚本搜索到第n个逗号,有些脚本似乎从行尾开始向后搜索(这不起作用,因为有带逗号的文本字段)。到目前为止,我在PowerShell脚本中得到的最接近的是:

-replace('^(?:[^,]*\,){3}([^,]*)\bW\b', 'West')


但这将用West替换W及其之前的所有内容。
很可能还有更好的方法来做到这一点,但我已经花了比我预期的更多的时间。如有任何帮助,将不胜感激!

5fjcxozz

5fjcxozz1#

相当直接。你尝试的正则表达式非常接近。
第四列中W之前的值必须与West沿着写回
在替代品中。
这是一种便携式解决方案。

@"(?m)^((?:[^,]*,){3}[^,]*?)\bW\b"

字符串
替换$1West
https://regex101.com/r/zLlP7L/1

(?m)
^
(                             # (1 start)
   (?: [^,]* , ){3}
   [^,]*? 
)                             # (1 end)
\b W \b

d6kp6zgx

d6kp6zgx2#

使用Notepad++:

  • Ctrl+H
  • 查找:^(?:[^,]*\,){3}[^,]*?\KW
  • 替换为:West
    **TICK 匹配案例 *
    ***滴答 * 缠绕 *
    ***SELECT * 正则表达式 *
  • 全部更换
    说明:
^           # beginning of line
(?:         # non capture group
    [^,]*       # 0 or more any character that is not a comma
    ,           # a comma
){3}        # end group, must appear 3 times
[^,]*?      # 0 or more any character that is not a comma, not greedy
\K          # forget all we have seen until this position
W           # letter W

字符串

前截图:


的数据

后截图:


fjaof16o

fjaof16o3#

您可以使用lookbehind来执行Assert,而不匹配这些内容(请注意,,不需要转义):

(?m)               # (Make '^' means the start of a line)
(?<=               # Match something preceded by
  ^(?:[^,]*,){3}   # 3 columns at the start of line
  [^,]*            # then 0 or more non-comma characters,
)                  # in which "something" means
\bW\b              # a 'W' with no adjacent word characters.

字符串
假设$string是您的输入,这里有一个简短的Powershell代码段:
(免责声明:我不太了解Powershell。

$result = $string -replace '(?m)(?<=^(?:[^,]*,){3}[^,]*)\bW\b', 'West'


注意,Powershell有built-in support来解析CSV文件。你可能想用它来避免任何潜在的问题。
试试tio.run。
试试on regex101.com

jrcvhitl

jrcvhitl4#

在这种情况下,我通常会编写一些有点冗长的正则表达式,但这确实有效。
在这种情况下,我会这样做:
第一个月
虽然我不确定正则表达式在powershell中是如何工作的,但有时你应该使用$1$2,...或者甚至%1%2、…但我相信\1\2,...是最常见的。
解释/细分:

  • ^:匹配行的开头
  • ([^,]*)匹配任何不是逗号的字符。这将是我们的第一个捕获组\1
  • ,匹配文字逗号
  • ([^,]*),([^,]*),另外两个不带逗号的捕获组,用于\2\3
  • ([^,]*)\bW\b,匹配捕获组\4中不带逗号的内容,然后是W,然后是逗号。

替换为:\1,\2,\3,\4West,我们使用捕获组,然后向西。

相关问题