1

细绳:

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

当前正则表达式:

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

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

4

2 回答 2

1

我建议您按单词拆分输入字符串,然后对其进行模式匹配,事件更简单:如果您只想测试每个单词的第一个字母是否为大写,则不要进行模式匹配,例如:

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

对我来说听起来要快得多(如果需要,您甚至可以使用失败的单词)。

于 2012-08-30T10:13:29.690 回答
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是它可以匹配你没有想到的东西。

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_.
于 2012-08-30T10:10:43.993 回答