大写字母&;java匹配的字符

大写字母&;java匹配的字符,java,regex,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

我无法让一个简单的正则表达式工作,现在我有以下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 测试,测试,测试=真 测试,测试,测试=错误 测试,7-测试,测试=真 测试,7-测试,测试=错误 na=错误 NA=正确 不适用=正确 苯氧基乙醇,P0LYS0RBATE 20,CI 19140,CI 14700真的
非常感谢

您最好使用分隔符,例如与stringtokenizer一起使用,然后进行检查,这样会容易得多。使用“,”作为delimeter,然后修剪每个标记并使用regex进行检查。

您最好使用delimiter,例如使用stringtokenizer,然后进行检查,这样会容易得多。使用“,”作为delimeter,然后修剪每个令牌并使用regex进行检查。

这可能适合您

字符串regex=“^([A-Z0-9]+[A-Za-Z0-9,./\-]\s)+$”


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

这可能适合您

字符串regex=“^([A-Z0-9]+[A-Za-Z0-9,./\-]\s)+$”


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

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

\p{Upper}*[^\p{Lower}]*\p{Upper}*
这意味着:

\p{Upper}任何大写字符

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


obs:空文本也会匹配

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

\p{Upper}*[^\p{Lower}]*\p{Upper}*
这意味着:

\p{Upper}任何大写字符

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


obs:空文本也将匹配

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

"^((^|[^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]*$"

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

"^((^|[^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]*$"

我不明白这个:测试,7测试,测试=错误。它有逗号,应该是真的否?有一个单词
Test[Test]
不是大写的。您是否考虑过使用nope中描述的方法测试是小写的,所以很简单:只要单词以大写开头或单个字符是大写的,就允许一切case@Edd是的,我尝试了各种方法,要么我遇到了不定式计算时间,要么正则表达式与大写词不匹配,要么被“.”或数字弄糊涂了。我不懂这个:Test,7-Test,Test=false。它有逗号,应该是真的否?有一个单词
Test[Test]
不是大写的。您是否考虑过使用nope中描述的方法测试是小写的,所以很简单:只要单词以大写开头或单个字符是大写的,就允许一切case@Edd是的,我尝试了各种方法,要么我遇到不定式计算时间,要么正则表达式与大写词不匹配,要么被“.”或数字弄糊涂。我使用验证引擎。没有机会添加java代码。谢谢,虽然我使用了验证引擎。没有机会添加java代码。谢谢,为什么
Test,Test,Test
返回false??除此之外,我喜欢它。为什么
Test,Test,Test
返回false??除此之外,我喜欢它