很难找出正确的正则表达式以匹配大写单词

时间:2012-08-30 17:26:18

标签: java regex pattern-matching match

我有一个简单的要求。我们使用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/(当然没有双反斜杠)

感谢您的帮助!!!

4 个答案:

答案 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]*?的大写字母。