我有一个简单的要求。我们使用hibernate验证引擎来确定约束是真还是假。
如果所有单词都以大写字母开头,则True应为文本。 有一些困难:
单词也可以这样开始
8-Test or even 8Test or even (Test) or even -Test or anything comparable通常它们也以逗号分隔(或不同的分隔符):
Test, Test, Test记住我只想确保String中的单词以大写字母开头。当你看到我的尝试时,我可能过于复杂了。
以下是一些示例: 预计匹配所有(真实):
- Hydroxyisohexyl 3-Cyclohexene Carboxaldehyde, Benzyl - Test, Test, Test - CI 15510, Methylchloroisothiazolinone, Disodium EDTA - N/A - NA预计不匹配所有(错误):
- hydroxyisohexyl 3-Cyclohexene Carboxaldehyde, Benzyl - Test, test, Test - CI 15510, Methylchloroisothiazolinone, Disodium eDTA - na - n/a我尝试了这个方向:
final String oldregex = "([\\W]*\\b[A-Z\\d]\\w+\\b[\\W]*)+";
final String regex = "([A-Z][\\d\\w]+( [A-Z][-\\d\\w]+)*, )*[A-Z][-\\d\\w]+( [A-Z][-\\d\\w]+)*\\.";'
实际上用“ oldregex ”选项,我遇到了一些文本的不定式计算
用它来测试正则表达式:http://gskinner.com/RegExr/(当然没有双反斜杠)
感谢您的帮助!!!
答案 0 :(得分:6)
查看 in action :
^(?:[^A-Za-z]*[A-Z][^\s,]*)*[^A-Za-z]*$
^ # start of the string
(?: # this group matches a "word", don't capture the group
[^A-Za-z]* # skip any non-alphabet characters at start of the word
[A-Z] # force an uppercase letter as a first letter
[^\s,]* # match anything but word separators (\s and ,) after 1th letter
)* # the whole line consists of such "words"
[^A-Za-z]* # skip any non-alphabet characters at the end of the string
$ # end of the string
注意:如果您的单词分隔符不同于空格和逗号,则可以修改正则表达式。 (例如,将[^\s,]
更改为[^,:-]
或您使用的任何内容)
答案 1 :(得分:1)
测试了这个
^([^A-Za-z]*[A-Z][A-Za-z]*)+?$
适用于您的测试用例
编辑:
^([^A-Za-z]*?[A-Z][A-Za-z]*?)+.?
表现性能问题
答案 2 :(得分:1)
这就是我想要的:Uppercase Words & Characters java matches
"^((^|[^A-Za-z]+)[A-Z][A-Za-z]*)*[^A-Za-z]*$"
答案 3 :(得分:0)
这样的事似乎是对的:
\b[^a-zA-Z,\s]*?[A-Z][^,\s]*?(\b|,)
\b
匹配单词边界。 [^a-zA-Z]*?
允许不是字母的前缀。然后我们有一个带有[A-Z]
的单个大写字母,后跟任何不是带[^A-Z,\s]*?
的大写字母。