大写单词&字符java匹配

时间:2012-08-31 12:05:18

标签: java regex

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

非常感谢!!!

4 个答案:

答案 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:空文本也匹配