字符串:
Aqua,月桂基醚硫酸钠,十二烷基硫酸钠,椰油酰胺MEA,碳酸锌,二硬脂酸乙二醇酯,氯化钠,吡啶硫酮锌,二甲苯磺酸钠,十六烷醇,香水,瓜尔胶羟丙基三甲基氯化铵,硫酸镁,苯甲酸钠,铵硫酸盐,碳酸氢镁,芳樟醇,丁基苯基甲基丙烯,柠檬烯,羟基异己基3-环己烯甲醛,苯甲醇,己基肉桂酸,香茅醇,生育酚乙酸酯,石蜡液,聚萘磺酸钠,CI 19140,DMDM乙内酰脲,CI 15510,甲基氯异噻唑啉酮,EDTA二钠, EDTA四钠,甲基异噻唑啉酮。
当前正则表达式:
System.out.println(string.matches("([\\W]*\\b[A-Z\\d]\\w+\\b[\\W]*)+"));
Java应用程序挂起。我在RegEx中找不到错误。通过googeling我发现这可能被称为“灾难性的回溯”!? 如果它只包含大写单词,则正则表达式应与String匹配 如果例如1个单词是小写的,则不应该匹配它。
答案 0 :(得分:1)
我建议你逐字分割你的输入字符串,然后模式匹配它,事件更简单:如果你只想测试每个单词的第一个字母是大写的话,不要模式匹配,如:
for (String s : string.split("\\W")) {
if (s.charAt(0) < 'A' || s.charAt(0) > 'Z') {
return false;
}
}
对我来说听起来快得多(如果需要,你甚至可以说失败的话)。
答案 1 :(得分:0)
也许你的想法是
String regex = "([A-Z][\\d\\w]+( [A-Z][-\\d\\w]+)*, )*[A-Z][-\\d\\w]+( [A-Z][-\\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[A-Z\\d]\\w+\\b[\\W\\d]*)+"))
System.out.println(string);
}
打印诸如
之类的内容"^;%XX`'SwJ|[*4"*0C<Tgbom_. \^
{PvU_y9aJSm?08EL( NpfA9a[:$YbN8VTtMk
;![`LR7Yy\AO5PZ@X4}GajC<*XvKE11
8l5W6*IDNH[9C'@.>7`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_.