1

我无法使用简单的正则表达式,现在我有以下 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)); 

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

测试,测试,测试 = 真
测试,测试,测试 = 假
测试,7-测试测试,测试 = true
测试,7-测试测试,测试 = 假
na = 假
不适用 = 真
不适用 = 真
苯氧乙醇, P0LYS0RBATE 20, CI 19140, CI 14700. = true

非常感谢!!!

4

4 回答 4

1

这似乎适用于您提供的所有输入:

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

我不确定您的验证器是如何工作的,但是通过在两端添加^and符号来强制匹配整个字符串并没有什么坏处。$

您的正则表达式永远不会终止,因为您使用了太多*(匹配零个或更多)组,这使得状态空间爆炸。+请注意我如何在组上使用 a [^A-Za-z],这会强制它在匹配组之间匹配至少一个非字母。这将匹配的数量保持在合理的数量。但是,由于我的匹配一个完整的字符串(它以 开头^和结尾$)它无论如何只能找到一个匹配项。

编辑:

如果您不希望空字符串匹配,则将倒数第二个更改*为 a +

"^((^|[^A-Za-z]+)[A-Z][A-Za-z]*)+[^A-Za-z]*$"
于 2012-08-31T13:06:45.353 回答
0

这可能对你有用

字符串正则表达式 = "^([A-Z0-9]+[A-Za-z0-9,./\-] \s )+$";

您可能需要添加更多分隔符(示例中为,./ 和 -)

于 2012-08-31T12:33:30.967 回答
0

也许这个正则表达式适合你:

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

它的意思是:

\p{Upper} 任何大写字符

[^\p{Lower}] 除小写字符外的任何字符

obs:空文本也将匹配

于 2012-08-31T12:35:10.140 回答
0

你最好使用分隔符,例如使用 stringtokenizer 然后检查,它会容易得多。使用“,”作为分隔符,然后修剪每个标记并使用正则表达式检查。

于 2012-08-31T12:30:12.123 回答