如何查找前面或后面没有另一个逗号的逗号?

How to find commas not preceded or followed by another comma?

我有一个包含数千行的文本文件,如下所示:

8/15/2016,,Amazon,,15.93 ;most are like this
8/24/2016,,Google,18.73  ;a few are like this - one comma only
8/26/2016,,Ebay,,60.2    ;

大部分行都有两个逗号,后跟一些文本,再后跟两个逗号,再后跟一个数值。短短几十行,如二行。数值前只有一个逗号。

我正在尝试使用 Regex 查找这几十行。我没有使用编程语言,只是 Notepad++。我的问题是我到目前为止提出的正则表达式同时捕获了两者。我一直在 regex101.com

进行试验

我得到了这样的东西:2016,,.+?,[0-9]

我认为这意味着 "Find 2016,, followed by any number of characters until you find a comma followed by a numeric digit," 但它找到每一行,无论它有一个还是两个逗号(或更多,当我添加一些以查看发生了什么时发现)。

我读到正则表达式搜索 "greedily,",但我认为 .+ 后的问号使搜索在第一次出现时停止。

我什至尝试 2016,,.+?,{1}[0-9] 认为 {1} 意味着 "just one," 但不,那也不起作用。

您可以试试前面没有逗号,后面也没有逗号的逗号:

[^,],[^,]

如果要捕获整行,请在开头和结尾添加 .*Regex101

如果你想select只包含一个逗号的行你可以使用这个

.*[^,],[^,].*

但是如果你想用双逗号或双逗号替换逗号,你可以

ctrl+f > , >查找所有 > supr > ,(或,)

那是因为2016,,.+?,[0-9].+?只排除了最后一个逗号:

           ▼▼▼▼▼▼▼▼▼
8/15/2016,,Amazon,,,,15.93

嘿,意思是任何字符,不是吗?


Code Different 的答案很好,但这里有一些替代方案:

• 使用 negated characters class:

2016,,[^,]+,[0-9]

• 使用 negative lookahead/lookbehind(注意,一些正则表达式引擎不支持它们,尽管 Notepad++ 支持,但回顾必须是固定长度):

(?<!,),(?!,)

如果您使用否定断言来查找单个逗号,
在 文字逗号之后使用断言 要快得多。

在正则表达式中首先放置一个否定断言会增加 6 倍的开销(在本例中)
与首先找到文字,然后检查断言相比。

这是因为它必须 运行 堆栈上的 断言 每个
字符位置,而不是先找到文字。

好=,(?!,)(?<!,,) 不好 = (?<!,),(?!,)

比较

目标重复字符串 29 次。

8/15/2016,,Amazon,,15.93 ;most are like this
8/24/2016,,Google,18.73  ;a few are like this - one comma only
8/26/2016,,Ebay,,60.2    ;
...
8/15/2016,,Amazon,,15.93 ;most are like this
8/24/2016,,Google,18.73  ;a few are like this - one comma only
8/26/2016,,Ebay,,60.2    ;
... (29 times total)  

基准

Regex1:   ,(?!,)(?<!,,)
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   29
Elapsed Time:    5.92 s,   5919.16 ms,   5919161 µs


Regex2:   (?<!,),(?!,)
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   29
Elapsed Time:    36.81 s,   36806.16 ms,   36806159 µs