我刚刚买了一本关于Regex的书,试图让我的头脑,但我仍然在努力解决它。我正在尝试创建一个java正则表达式,它将满足可以的字符串配置;
例如,以下情况属实:
*:*:*
但以下是错误的:
这是我到目前为止所做的:
^[a-z-]|*[:?][a-z-]|*[:?][a-z-]|*
答案 0 :(得分:3)
这是一个适用于所有情况的正则表达式:
([a-z]+([,-][a-z]+)*|\*)(:([a-z]+)([,-][a-z]+)*|\*)*
以下是详细分析:
用于构建复杂的正则表达式的基本结构之一实际上非常简单,其形式为 text
(
separator text
)*
。该表单的正则表达式将匹配:
所以这是代码的细分:
[a-z]+([,-][a-z]+)*
是我上面讨论过的模式的一个实例: text 这里是[a-z]+
,而分隔符是{{1} }。[,-]
允许匹配星号。([a-z]+([,-][a-z]+)*|\*)
是我上面讨论的模式的另一个实例:文本是([a-z]+([,-][a-z]+)*|\*)(:([a-z]+([,-][a-z]+)*|\*))*
,而分隔符是([a-z]+([,-][a-z]+)*|\*)
如果您计划将此作为更大正则表达式的一个组件,其中组匹配将很重要,我建议将内部parens非分组,并将分组parens放在整个正则表达式中,如下所示:
:
答案 1 :(得分:2)
我们很少在这里看到可以定义正面和负面测试用例的人。这让生活变得更加轻松。
这是我的正则表达式,95%的解决方案:
"(([a-z]+|\\*)[:,-])*([a-z]+|\\*)"
(JAVA-Version)(([a-z]+|\*)[:,-])*([a-z]+|\*)
(普通正则表达式)它简单地区分单词(a-z或*)和分隔符( - , - 之一),它必须包含至少一个单词,单词必须用分隔符分隔。它适用于正面案例和负面案例,除了最后两个消极案例。
一句话:这种复杂的“语法”实际上可以使用像ANTLR这样的语法定义工具(或者几年前使用lex / yacc,flex / bison)来实现。正则表达式可以做到这一点,但不容易维护。