用于验证字符串的Java正则表达式
我刚买了一本关于Regex的书,试图让我的头脑了解它,但我仍然在努力学习。我正在尝试创建一个java正则表达式,它将满足一个字符串配置,可以:用于验证字符串的Java正则表达式,java,regex,Java,Regex,我刚买了一本关于Regex的书,试图让我的头脑了解它,但我仍然在努力学习。我正在尝试创建一个java正则表达式,它将满足一个字符串配置,可以: 可以包含小写字母([a-z]) 可以包含逗号(,),但只能在单词之间 可以包含冒号(:),但必须用单词或乘法(*)分隔 可以包含连字符(-),但必须用单词分隔 可以包含乘法(*),但如果使用,则必须是冒号之前/之间/之后的唯一字符 不能包含空格,“单词”由连字符(-)或逗号(,)或冒号(:)或字符串结尾分隔 因此,例如,以下情况是正确的: 福:酒吧 富吧
*:*:*
^[a-z-]|*[:?][a-z-]|*[:?][a-z-]|*
我们很少看到有人能定义阳性和阴性测试用例。这让生活变得更加轻松 以下是我的正则表达式,其中包含95%的解决方案:
(JAVA版本)“([a-z]+\\*)[:,-])*([a-z]+\\*)”
(纯正则表达式)([a-z]+\*)[:,-])*([a-z]+\*)
一句话:这样一个复杂的“语法”在现实生活中可以通过语法定义工具如ANTLR(或者几年前使用lex/yacc、flex/bison)来实现。正则表达式可以做到这一点,但维护起来并不容易。这里有一个正则表达式,它适用于所有情况:
([a-z]+([,-][a-z]+)*|\*)(:([a-z]+)([,-][a-z]+)*|\*)*
以下是详细的分析:
用于构建像这样复杂的正则表达式的基本结构之一实际上非常简单,其形式为text
(
分隔符text
)*
。该形式的正则表达式将匹配:
- 一个文本
- 一个文本、分隔符和另一个文本
- 一个文本,一个分隔符,另一个文本,另一个分隔符,还有另一个文本
- 或者更多,只需在末尾添加另一个分隔符和文本
是我上面讨论的模式的一个实例:这里的文本是[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]+)(?:[,-][a-z]+)*|\*)*)
您是否尝试了一些方法来完成此任务?尝试一些方法并发布您的试用结果,我们将在这里帮助您。将我的答案转换为所问的注释:这不是java代码,但这里有一个web服务,您可以在其中在线测试regexp:。这是个救命稻草。至少它节省了很多时间。除了你的书之外,你还应该记住模式类的javadoc:+1,因为它提到了ANTLR,我从来没有听说过,但我会研究它,因为它看起来很有趣。因为OP正在学习正则表达式,把它分解并解释它的不同组成部分可能是有益的。如果你不介意把它分解的话,那将是非常重要的helpfull@RyanWH完成了分解。非常感谢您花时间以如此建设性的方式分解它,它非常有用。然而,我确实发现您发布的解决方案不太有效,原因有两个。第一个很可能是打字错误,因为你在开头放了太多的括号,而结尾的括号却不匹配。另一个是模式的第二个实例不允许使用“*”。以防万一您感兴趣,我修改了括号以匹配您的解释,现在它可以工作了:
([a-z]+([,-][a-z]+)*|\*)(:([a-z]+([,-][a-z]+)*|\*)*