Java Regex验证String

时间:2013-09-12 14:56:14

标签: java regex

我刚刚买了一本关于Regex的书,试图让我的头脑,但我仍然在努力解决它。我正在尝试创建一个java正则表达式,它将满足可以的字符串配置;

  1. 可以包含小写字母([a-z])
  2. 可以包含逗号(,),但只能包含单词
  3. 可以包含冒号(:)但必须用单词分隔或乘以(*)
  4. 可以包含连字符( - )但必须用单词
  5. 分隔
  6. 可以包含乘法(*)但是如果使用它必须是冒号之前/之间/之后的唯一字符
  7. 不能包含空格,'words'用连字符( - )或逗号(,)或冒号(:)或字符串的结尾分隔
  8. 例如,以下情况属实:

    1. FOO:巴
    2. FOO杆:FOO
    3. FOO,巴:FOO
    4. FOO酒吧,FOO:巴,FOO杆
    5. FOO:条:FOO,酒吧
    6. *:FOO
    7. FOO:*
    8. *:*:*
    9. 但以下是错误的:

      1. foo:bar
      2. ,FOO:杆
      3. foo-:巴
      4. -foo:巴
      5. FOO,:巴 -
      6. FOO:巴,
      7. FOO,*:杆
      8. FOO - *:杆
      9. 这是我到目前为止所做的:

        ^[a-z-]|*[:?][a-z-]|*[:?][a-z-]|*
        

2 个答案:

答案 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)来实现。正则表达式可以做到这一点,但不容易维护。