正则表达式挂起 – Java匹配器

串:

Aqua,月桂醇硫酸钠,十二烷基硫酸钠,二甲基硅氧烷,椰油酰胺MEA,碳酸锌,二硬脂酸二乙酯,氯化钠,吡啶硫酮锌,二甲苯磺酸钠,十六烷醇,香水,瓜尔胶羟丙基三甲基氯化铵,硫酸镁,苯甲酸钠,月桂酸铵,镁碳酸氢盐,芳樟醇,丁基苯基甲基丙酸,柠檬烯,羟基异己基3-环己烯甲醛,苯甲醇,己基肉桂,香茅醇,生育酚乙酸酯,石蜡液,聚萘磺酸钠,CI 19140,DMDM乙内酰脲,CI 15510,甲基氯异噻唑啉酮,EDTA二钠,EDTA四钠,甲基异。

目前的正则表达式:

System.out.println(string.matches("([\\W]*\\b[AZ\\d]\\w+\\b[\\W]*)+")); 

Java应用程序挂断了。 我在RegEx中找不到错误。 通过googeling我发现这可能被称为“灾难性的回溯”!? 正则表达式应匹配字符串,如果它只包含大写单词,例如,如果1个单词是小写的,则不应该匹配它。

我建议你逐字分割你的输入字符串然后模式匹配它,事件更简单:如果你只想测试每个单词的第一个字母是大写的话,不要模式匹配,如:

 for (String s : string.split("\\W")) { if (s.charAt(0) < 'A' || s.charAt(0) > 'Z') { return false; } } 

对我来说听起来要快得多(如果需要,你甚至可以说失败的话)。

也许你的想法是

 String regex = "([AZ][\\d\\w]+( [AZ][-\\d\\w]+)*, )*[AZ][-\\d\\w]+( [AZ][-\\d\\w]+)*\\."; System.out.println(string.matches(regex)); 

返回true。

正则表达式的问题在于它过于复杂。 添加表达式直到你得到true的缺点是它可以匹配你没有想到的东西。

 Random rand = new Random(); while(true) { byte[] bytes = new byte[40]; rand.nextBytes(bytes); for (int i = 0; i < bytes.length; i++) bytes[i] &= 0x7F; String string = new String(bytes, 0); if (string.matches("([\\W]*\\b[AZ\\d]\\w+\\b[\\W\\d]*)+")) System.out.println(string); } 

打印诸如的东西

 "^;%XX`'SwJ|[*4"*0C7`LHsCN*,{26O} EFJ5MBVxi%W_t6v54EmLmgjFvqyYh\<" +7]|ULh2[MT`Yx{MKH4N '8p!2mf 

而我给出的表达匹配

 KfhBuGv7, S3. IWzu, XHop4Z. LJbXfrd, PdR. V2dxQV, LA9z. HKf37cy0, TS. RAw2E5a, Ajs. Up-, GPQ7 I_.