我需要使用正则表达式模式检查输入字符串的正确性,每个单词都应以大写字母开头,最后也可以用“-”分隔表达式。 字符串至少应包含两个单词或带破折号的表达式。
例如
正确:
Apple Banana Couonut日期
苹果香蕉
香蕉Couonut日期
花生酱日期
不正确:
苹果
Apple Banana Couonut日期
BanAna couonut-Dates
Pattern pattern = Pattern.compile("([A-Z][a-z]++ )*([A-Z][a-z]++-[A-Z][a-z]++)");
pattern.matcher("Apple Banana Couonut-Dates").matches();
对于输入“ Apple Banana Couonut-Dates”,我的表达式返回false
答案 0 :(得分:2)
要使至少2个大写单词与一个可选部分匹配,该可选部分的末尾用-
分隔表达式,或者用-
分隔一个表达式,您可以使用:
^(?:[A-Z][a-z]+(?: [A-Z][a-z]+\b(?!-))+(?: [A-Z][a-z]+-[A-Z][a-z]+)?|(?:[A-Z][a-z]+ )?[A-Z][a-z]+-[A-Z][a-z]+)$
^
字符串的开头(?:
非捕获组
[A-Z][a-z]+
匹配大写单词(?: [A-Z][a-z]+\b(?!-))+
重复1次以上大写单词,断言右边不是-
(?: [A-Z][a-z]+-[A-Z][a-z]+)?
可选部分,匹配空间和大写单词-大写单词|
或(?:[A-Z][a-z]+ )?
将可选的大写单词与空格匹配[A-Z][a-z]+-[A-Z][a-z]+
)$
字符串结尾请注意,使用Java可以使转义符两次转义。