Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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,我正在使用正则表达式检查应用程序中字符串的正确性。我想检查字符串是否有以下模式: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

我正在使用正则表达式检查应用程序中字符串的正确性。我想检查字符串是否有以下模式: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=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()
一起使用时,可以省略
^
$
锚定

详细信息

  • ^
    -字符串的开头
  • [a-zA-Z0-9]*
    -0+字母数字字符(可替换为
    \p{Alnum}
  • =
    -一个
    =
    符号
  • [a-zA-Z0-9]*
    -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]*)*$

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]
模式:

^[^=&]*=[^=&]*(?:&[^=&]*=[^=&]*)*$
请参见以下内容:

^\w*=\w*(?:&(?:\w*=\w*))*$
  • ^
    是起始锚点
  • (\w*=\w*)
    表示参数,如
    abc=def
    • \w
      匹配一个单词字符
      [a-zA-Z0-9'
    • \w*
      表示0个或更多字符
  • &
    表示实际的符号和文字
  • (&(\w*=\w*)*
    匹配任何后续参数,如
    &b=d
  • $
    表示结束锚点

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

注意:正如@WiktorStribiżew在评论中指出的那样,
\w
也将匹配
\uu
,因此如果要在模式中避免下划线,则应修改上述正则表达式以排除下划线,即
[A-Za-z0-9]
给您:

^\w*=\w*(?:&(?:\w*=\w*))*$
  • ^
    是起始锚点
  • (\w*=\w*)
    表示参数,如
    abc=def
    • \w
      匹配一个单词字符
      [a-zA-Z0-9'
    • \w*
      表示0个或更多字符
  • &
    表示实际的符号和文字
  • (&(\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]
。谢谢量化模式开始比量化模式结束时导致更多冗余回溯。量化模式开始比量化模式结束时导致更多冗余回溯。