我试图清理一个很大的.csv文件,其中包含许多逗号分隔的单词,需要合并其中的一部分。所以我有一个小节,我想将所有逗号都改为斜杠。可以说我的文件包含以下文本:
Foo,bar,spam,eggs,extra,parts,spoon,eggs,sudo,test,example,blah,pool
我想选择唯一的单词bar和blah之间的所有逗号。这个想法是然后用斜杠替换逗号(使用查找和替换),这样我得到以下结果:
Foo,bar,spam/eggs/extra/parts/spoon/eggs/sudo/test/example,blah,pool
根据@EganWolf输入: 如何在搜索中包括单词,但将它们从选择中排除(对于唯一单词),然后如何仅匹配单词之间的逗号?
到目前为止,我只设法选择了包括它们在内的唯一词之间的所有文本:
bar,.*,blah
,bar:*, *,blah
,(bar:.+?,blah)*,*\2
我尝试过否定的前瞻性,但无法从语句中获得任何搜索结果。
答案 0 :(得分:2)
使用记事本++,您可以执行以下操作:
(?:\bbar,|\G(?!^))\K([^,]*),(?=.+\bblah\b)
$1/
. matches newline
说明:
(?: # start non capture group
\bbar, # word boundary then bar then a comma
| # OR
\G # restart from last match position
(?!^) # negative lookahead, make sure not followed by beginning of line
) # end group
\K # forget all we've seen until this position
([^,]*) # group 1, 0 or more non comma
, # a comma
(?= # positive lookahead
.+ # 1 or more any character but newlie
\bblah\b # word boundary, blah, word boundary
) # end lookahead
给定示例的结果
Foo,bar,spam/eggs/extra/parts/spoon/eggs/sudo/test/example,blah,pool
屏幕截图:
答案 1 :(得分:1)
以下正则表达式将捕获访问所需逗号所需的最少文字:
(?<=bar,)(.*?(,))*(?=.*?,blah)
请参见Regex Demo。
如果要替换逗号,则需要替换捕获组2中的所有内容。捕获组0具有整个匹配项。
另一种方法是用逗号分隔字符串以创建单词数组。然后使用/
在bar和blah之间连接单词,并附加,
连接的其他单词。
以下是PowerShell拆分和联接的示例:
$a = "Foo,bar,spam,eggs,extra,parts,spoon,eggs,sudo,test,example,blah,pool"
$split = $a -split ","
$slashBegin = $split.indexof("bar")+1
$commaEnd = $split.indexof("blah")-1
$str1 = $split[0..($slashbegin-1)] -join ","
$str2 = $split[($slashbegin)..$commaend] -join "/"
$str3 = $split[($commaend+1)..$split.count] -join ","
@($str1,$str2,$str3) -join ","
Foo,bar,spam/eggs/extra/parts/spoon/eggs/sudo/test/example,blah,pool
可以很容易地将其变成一个功能,以整个行和关键字作为输入。