我无法使用简单的正则表达式,现在我有以下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 :(得分: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]*$"
答案 1 :(得分:0)
你最好使用分隔符,例如使用stringtokenizer,然后检查,它会更容易。使用','作为分隔符,然后修剪每个标记并使用正则表达式进行检查。
答案 2 :(得分:0)
这可能适合你
String regex =“^([A-Z0-9] + [A-Za-z0-9,。/ \ - ] \ s )+ $”;
您可能需要添加更多分隔符(,。/和 - 在示例中)
答案 3 :(得分:0)
也许这个正则表达式适合你:
\p{Upper}*[^\p{Lower}]*\p{Upper}*
意思是:
\ p {Upper}任何大写字符
[^ \ p {Lower}]除小写之外的任何字符
obs:空文本也匹配