大写字母&;java匹配的字符
我无法让一个简单的正则表达式工作,现在我有以下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
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??除此之外,我喜欢它