2012-08-31 16 views
1

我不能得到一个简单的正则表达式来工作,现在我有下面的Java代码大写单词和汉字的Java相匹配

String regex = "^([^A-Za-z]*?[A-Z][A-Za-z]*?)+.?"; 
String string = "AQUA, CETEARYL ALCOHOL, CETYL ESTERS, BEHENTRIMONIUM CHLORIDE, CETRIMONIUM CHLORIDE, AMODIMETHICONE, TRIDECETH-12, PARFUM, METHYLPARABEN, HEXYL CINNAMAL, LINALOOL, BENZYL SALICYLATE, LIMONENE, LAMINARIA DIGITATA, CHAMOMILLA RECUTITA , ANICOZANTHOS FLAVIDUS, SODIUM BENZ0ATE, PHENOXYETHANOL, ETHYLPARABEN, BUTYLPARABEN, PROPYLPARABEN, P0LYS0RBATE 20, CI 19140, CI 14700."; 
System.out.println(string.matches(regex)); 

的问题是,执行永远不会结束。 请仅使用我的正则表达式来查看我如何失败。我需要的东西听起来很简单: - 可以有任何文字。 - 本文中的所有单词均应为大写。 - 如果有单个字符,它们也应该是大写字母。 - (数字,逗号,...)之间有什么要始终一致。 请参阅上面的复杂示例。 简单是:

 
Test, Test, Test = true 
Test, test, Test = false 
Test, 7-Test Test, Test = true 
Test, 7-Test test, Test = false 
na = false 
NA = true 
N/A = true 
PHENOXYETHANOL, P0LYS0RBATE 20, CI 19140, CI 14700. = true 

非常感谢!

+0

我不明白这一个:测试,7-测试测试,测试=错误。它有逗号,它应该是真的不是? – jocelyn

+0

有一个单词'Test [test]'不是大写字母。 – Alex

+0

您是否考虑过使用[您之前的问题]中描述的方法(http://stackoverflow.com/questions/12194456/regular-expression-hangs-java-matcher) – Edd

回答

1

这似乎对你提供的输入工作:

"^((^|[^A-Za-z]+)[A-Z][A-Za-z]*)*[^A-Za-z]*$" 

我不知道你是如何验证工作,但它不会伤害强制匹配通过添加在任一端的^$符号完整的字符串。

你的正则表达式永远不会终止,因为你用了太多的*(匹配零个或多个)群体,这使得状态空间爆炸。注意我是如何在[^A-Za-z]组,这迫使它匹配的匹配组之间至少有一个非字母使用+。这将匹配的数量保持在合理的数量。然而,由于我的一个完整的字符串匹配(它^开始,以$结束),它只能找到一个匹配反正。

编辑:

如果你不想空字符串匹配然后更改第二个到最后*+

"^((^|[^A-Za-z]+)[A-Z][A-Za-z]*)+[^A-Za-z]*$" 
0

您更好地使用的分隔符,用于例如用StringTokenizer的再检查,这将是一个很多更容易。使用','作为分隔符,然后修剪每个标记并使用正则表达式进行检查。

+0

我使用验证引擎。没有机会添加Java代码。虽然 – user1635689

0

这可能为你工作

字符串的regex = “^([A-Z0-9] + [A-ZA-Z0-9,/ \ - ] \ S)+ $”; (。,/和 - 在本例中)

,你可能需要添加一些分离

0

也许这正则表达式为你的作品:

\p{Upper}*[^\p{Lower}]*\p{Upper}* 

这意味着:

\ p {上}任何大写字符

[^ \ p {下}}除小写字母以外的任何字符

个OBS:一个空的文本匹配的意愿也

+0

为什么它返回错误'测试,测试,测试???除此之外,我喜欢它 – user1635689