我有一个包含数千行的文本文件:
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]
意味着“只有一个”,但不是,这也不起作用。
答案 0 :(得分:2)
那是因为.+?
的{{1}}只排除了最后一个逗号:
2016,,.+?,[0-9]
嘿,这意味着任何字符,不是吗?
Code Different的答案很好,不过这里有一些选择:
▼▼▼▼▼▼▼▼▼
8/15/2016,,Amazon,,,,15.93
•使用negative lookahead/lookbehind(注意,一些正则表达式引擎不支持它们,虽然Notepad ++确实如此,但仍然需要固定长度):
2016,,[^,]+,[0-9]
答案 1 :(得分:1)
答案 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