Java正则表达式,匹配模式,一对单词

时间:2017-05-21 19:45:07

标签: java regex

我正在使用正则表达式来检查我的应用程序中字符串的正确性。我想检查字符串是否具有以下模式:x = y& a = b& ... x,y,a,b等可以为空。

正确字符串示例:

abc=def&gef=cda&pdf=cdf
=&gef=def
abc=&gef=def
=abc&gef=def

不正确的字符串示例:

abc=def&gef=cda&
abc=def&gef==cda&
abc=defgef=cda&abc=gda

这是我的代码,显示当前的解决方案:

    String pattern = "[[a-zA-Z0-9]*[=]{1}[a-zA-Z0-9]*[&]{1}]*";
    if(!Pattern.matches(pattern, s)){
        throw new IllegalArgumentException(s);
    }

此解决方案很糟糕,因为它接受如下字符串:

abc=def&gef=def&

任何人都可以用正确的模式帮助我吗?

3 个答案:

答案 0 :(得分:3)

您可以使用以下正则表达式:

^[a-zA-Z0-9]*=[a-zA-Z0-9]*(?:&[a-zA-Z0-9]*=[a-zA-Z0-9]*)*$

请参阅regex demo

matches()一起使用时,^$锚点可能会被省略。

<强>详情:

  • ^ - 字符串开头
  • [a-zA-Z0-9]* - 0+个字母数字字符(可以替换为\p{Alnum}
  • = - =符号
  • [a-zA-Z0-9]* - 0+字母数字字符
  • = - =符号
  • (?: - 开始匹配序列的非捕获组...
    • & - &符号
    • [a-zA-Z0-9]*=[a-zA-Z0-9]* - 与上述相同
  • )* - ...零次或多次出现
  • $ - 字符串结尾

注意:如果您想使模式更通用,您可以使用=&之外的任何字符匹配[^&=]模式替换限制性更强的[a-zA-Z0-9]模式:

^[^=&]*=[^=&]*(?:&[^=&]*=[^=&]*)*$

请参阅this regex demo

答案 1 :(得分:1)

你走了:

^\w*=\w*(?:&(?:\w*=\w*))*$
  • ^是起始锚
  • (\w*=\w*)代表abc=def等参数
    • \w匹配单词字符[a-zA-Z0-9_]
    • \w*代表0个或更多字符
  • &代表实际的&符号
  • (&(\w*=\w*))*匹配任何子项参数,例如&b=d等。
  • $代表结束锚

Regex101 Demo

编辑:使所有群组都无法捕获。

注意:正如@WiktorStribiżew在评论中指出的那样,\w也会匹配_,因此应修改上面的正则表达式以排除下划线,如果它们是在模式中避免使用,即[A-Za-z0-9]

答案 2 :(得分:1)

我相信你想要这个。

([a-zA-Z0-9]*=[a-zA-Z0-9]*&)*[a-zA-Z0-9]*=[a-zA-Z0-9]*

这匹配任意数量的重复,例如x=y,每个重复&之后;然后重复一次,例如x=y,而没有以下&