如何查找逗号之前或之后没有逗号?

时间:2017-06-13 03:00:08

标签: regex duplicates notepad++ comma regex-lookarounds

我有一个包含数千行的文本文件:

String input = "212425762_CHECK_08182014_1_USA";
String regex = "^([0-9]{9})_([A-Z]{5})_([0-9]{8})_(1_USA)$";
if (input.matches(regex)) {
    System.out.println("The input matches.");
}

大多数行都有两个逗号,后跟一些文本,后跟另外两个逗号,后跟一个数字值。只有几十条线就像第二条线。它们在数值前只有一个逗号。

我正在尝试使用正则表达式找到这几十行。我没有使用编程语言,只是Notepad ++。我的问题是,到目前为止,我提出的正则表达式都可以捕获。我一直在regex101.com进行实验

我有这样的事情: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 ;

我认为这意味着“查找2016,后跟任意数量的字符,直到找到逗号后跟数字数字”,但它会找到每一行,无论是否有一个或两个逗号(或更多,因为我当我添加一些东西时发现发生了什么事。)

我读到正则表达式“贪婪地”搜索,但我认为2016,,.+?,[0-9]之后的问号使搜索在第一次出现时停止。

我甚至试过.+认为2016,,.+?,{1}[0-9]意味着“只有一个”,但不是,这也不起作用。

4 个答案:

答案 0 :(得分:2)

那是因为.+?的{​​{1}}只排除了最后一个逗号:

2016,,.+?,[0-9]

嘿,这意味着任何字符,不是吗?


Code Different的答案很好,不过这里有一些选择:

•使用negated characters class

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

•使用negative lookahead/lookbehind(注意,一些正则表达式引擎不支持它们,虽然Notepad ++确实如此,但仍然需要固定长度):

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

答案 1 :(得分:1)

您可以尝试使用之前没有逗号的逗号:

[^,],[^,]

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

答案 2 :(得分:0)

如果您想选择只包含一个逗号的行,您可以使用此

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

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

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

答案 3 :(得分:0)

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

在正则表达式中首先设置否定断言会增加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