Java正则表达式,匹配模式,单词对
我正在使用正则表达式检查应用程序中字符串的正确性。我想检查字符串是否有以下模式:x=y&a=b&。。。x、 y、a、b等可以为空 正确字符串的示例:Java正则表达式,匹配模式,单词对,java,regex,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 错误字符串的示例: abc=d
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
错误字符串的示例:
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&
有人能帮我找到正确的模式吗?您可以使用以下正则表达式:
^[a-zA-Z0-9]*=[a-zA-Z0-9]*(?:&[a-zA-Z0-9]*=[a-zA-Z0-9]*)*$
见
与matches()
一起使用时,可以省略^
和$
锚定
详细信息:
-字符串的开头^
-0+字母数字字符(可替换为[a-zA-Z0-9]*
)\p{Alnum}
-一个=
符号=
-0+字母数字字符[a-zA-Z0-9]*
-一个=
符号=
-开始非捕获组匹配。。。(?:
-一个&
符号&
-同上[a-zA-Z0-9]*=[a-zA-Z0-9]*
-。。。零次或多次出现)*
-字符串结尾$
=
和&
之外的任何字符与[^&=]
模式匹配,该模式将取代限制性更强的[a-zA-Z0-9]
模式:
^[^=&]*=[^=&]*(?:&[^=&]*=[^=&]*)*$
请参见,您可以使用以下正则表达式:
^[a-zA-Z0-9]*=[a-zA-Z0-9]*(?:&[a-zA-Z0-9]*=[a-zA-Z0-9]*)*$
见
与matches()
一起使用时,可以省略^
和$
锚定
详细信息:
-字符串的开头^
-0+字母数字字符(可替换为[a-zA-Z0-9]*
)\p{Alnum}
-一个=
符号=
-0+字母数字字符[a-zA-Z0-9]*
-一个=
符号=
-开始非捕获组匹配。。。(?:
-一个&
符号&
-同上[a-zA-Z0-9]*=[a-zA-Z0-9]*
-。。。零次或多次出现)*
-字符串结尾$
=
和&
之外的任何字符与[^&=]
模式匹配,该模式将取代限制性更强的[a-zA-Z0-9]
模式:
^[^=&]*=[^=&]*(?:&[^=&]*=[^=&]*)*$
请参见以下内容:
^\w*=\w*(?:&(?:\w*=\w*))*$
是起始锚点^
表示参数,如(\w*=\w*)
abc=def
匹配一个单词字符\w
[a-zA-Z0-9'
表示0个或更多字符\w*
表示实际的符号和文字&
匹配任何后续参数,如(&(\w*=\w*)*
等&b=d
表示结束锚点$
\w
也将匹配\uu
,因此如果要在模式中避免下划线,则应修改上述正则表达式以排除下划线,即[A-Za-z0-9]
给您:
^\w*=\w*(?:&(?:\w*=\w*))*$
是起始锚点^
表示参数,如(\w*=\w*)
abc=def
匹配一个单词字符\w
[a-zA-Z0-9'
表示0个或更多字符\w*
表示实际的符号和文字&
匹配任何后续参数,如(&(\w*=\w*)*
等&b=d
表示结束锚点$
注意:正如@WiktorStribiżew在评论中指出的那样,
\w
也将匹配\uu
,因此如果要在模式中避免下划线,则应修改上述正则表达式以排除下划线,即[A-Za-z0-9]
我相信您希望这样
([a-zA-Z0-9]*=[a-zA-Z0-9]*&)*[a-zA-Z0-9]*=[a-zA-Z0-9]*
这将匹配任意数量的重复,如
x=y
,每个重复后面都有一个&
;然后重复一次,如x=y
,但不重复以下内容&
我相信您希望这样做
([a-zA-Z0-9]*=[a-zA-Z0-9]*&)*[a-zA-Z0-9]*=[a-zA-Z0-9]*
这将匹配任意数量的重复,如
x=y
,每个重复后面都有一个&
;然后重复一次,如x=y
,不包含以下&
否,字符串仅包含字母+数字或为空=&=将被更正否,字符串仅包含字母+数字或为空=&=将被更正\w
也匹配
符号。有效点@WiktorStribiżew,必须将所有\w
改为[A-Za-z0-9]
。谢谢<代码>\w也与符号相匹配。有效点@WiktorStribiżew必须将所有\w
改为[A-Za-z0-9]
。谢谢量化模式开始比量化模式结束时导致更多冗余回溯。量化模式开始比量化模式结束时导致更多冗余回溯。