用于验证字符串的Java正则表达式
我刚买了一本关于Regex的书,想试着了解一下它,但我仍然在努力学习。我正在尝试创建一个java正则表达式,它将满足一个字符串配置,可以:
- 可以包含小写字母([a-z])
- 可以包含逗号(,),但只能在单词之间
- 可以包含冒号(:),但必须用单词或乘法(*)分隔
- 可以包含连字符(-),但必须用单词分隔
- 可以包含乘法(*),但如果使用,它必须是冒号之前/之间/之后的唯一字符
- 不能包含空格,“单词”由连字符(-)或逗号(,)或冒号(:)或字符串结尾分隔
例如,以下是正确的:
- 福:酒吧
- foo bar:foo
- foo,bar:foo
- foo-bar,foo:bar,foo-bar
- foo:bar:foo,bar
- *:foo
- 傅:*
*:*:*
但以下是错误的:
- 福:酒吧
- foo:酒吧
- foo-:酒吧
- -福:酒吧
- 福:酒吧-
- 福:酒吧
- foo,*:bar
- foo-*:酒吧
这就是我目前的情况:
^[a-z-]|*[:?][a-z-]|*[:?][a-z-]|*
# 1 楼答案
我们很少看到有人能定义阳性和阴性测试用例。这让生活变得更加轻松
以下是我的正则表达式,它提供了95%的解决方案:
"(([a-z]+|\\*)[:,-])*([a-z]+|\\*)"
(JAVA版本)(([a-z]+|\*)[:,-])*([a-z]+|\*)
(普通正则表达式)它只是区分单词(a-z或*)和分隔符(其中一个:-,)并且它必须至少包含一个单词,并且单词必须用分隔符分隔。它适用于阳性病例和阴性病例,但最后两个阴性病例除外
一句话:这种复杂的“语法”在现实生活中可以通过语法定义工具ANTLR(或者几年前使用lex/yacc、flex/bison)来实现。Regex可以做到这一点,但维护起来并不容易