我正在使用正则表达式来检查我的应用程序中字符串的正确性。我想检查字符串是否具有以下模式: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&
任何人都可以用正确的模式帮助我吗?
答案 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]
模式:
^[^=&]*=[^=&]*(?:&[^=&]*=[^=&]*)*$
答案 1 :(得分:1)
你走了:
^\w*=\w*(?:&(?:\w*=\w*))*$
^
是起始锚(\w*=\w*)
代表abc=def
等参数
\w
匹配单词字符[a-zA-Z0-9_]
\w*
代表0个或更多字符&
代表实际的&符号(&(\w*=\w*))*
匹配任何子项参数,例如&b=d
等。$
代表结束锚编辑:使所有群组都无法捕获。
注意:正如@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
,而没有以下&
。