Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于验证字符串的Java正则表达式_Java_Regex - Fatal编程技术网

用于验证字符串的Java正则表达式

用于验证字符串的Java正则表达式,java,regex,Java,Regex,我刚买了一本关于Regex的书,试图让我的头脑了解它,但我仍然在努力学习。我正在尝试创建一个java正则表达式,它将满足一个字符串配置,可以: 可以包含小写字母([a-z]) 可以包含逗号(,),但只能在单词之间 可以包含冒号(:),但必须用单词或乘法(*)分隔 可以包含连字符(-),但必须用单词分隔 可以包含乘法(*),但如果使用,则必须是冒号之前/之间/之后的唯一字符 不能包含空格,“单词”由连字符(-)或逗号(,)或冒号(:)或字符串结尾分隔 因此,例如,以下情况是正确的: 福:酒吧 富吧

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

  • 可以包含小写字母([a-z])
  • 可以包含逗号(,),但只能在单词之间
  • 可以包含冒号(:),但必须用单词或乘法(*)分隔
  • 可以包含连字符(-),但必须用单词分隔
  • 可以包含乘法(*),但如果使用,则必须是冒号之前/之间/之后的唯一字符
  • 不能包含空格,“单词”由连字符(-)或逗号(,)或冒号(:)或字符串结尾分隔
  • 因此,例如,以下情况是正确的:

  • 福:酒吧
  • 富吧:富
  • foo,bar:foo
  • foo-bar,foo:bar,foo-bar
  • foo:bar:foo,bar
  • *:foo
  • 傅:*
  • *:*:*
  • 但以下情况是错误的:

  • 福:酒吧
  • ,foo:bar
  • foo-:bar
  • -福:酒吧
  • 福:巴-
  • 福:酒吧
  • foo,*:bar
  • foo-*:bar
  • 这就是我到目前为止所做的:

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

    我们很少看到有人能定义阳性和阴性测试用例。这让生活变得更加轻松

    以下是我的正则表达式,其中包含95%的解决方案:

    • “([a-z]+\\*)[:,-])*([a-z]+\\*)”
      (JAVA版本)
    • ([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]+)*|\*)*