Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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 任何单词、方括号、asc或desc或任何其他由逗号、方括号分隔的字符串的正则表达式_Java_Regex - Fatal编程技术网

Java 任何单词、方括号、asc或desc或任何其他由逗号、方括号分隔的字符串的正则表达式

Java 任何单词、方括号、asc或desc或任何其他由逗号、方括号分隔的字符串的正则表达式,java,regex,Java,Regex,我正在为下面的构造与regex进行斗争。首选语言是Java 任何单词、方括号、asc或desc或任何其他由逗号分隔的字符串(但当有多个由逗号asc或desc分隔的单词不能出现时),方括号 我已经想出了这个办法,但它不能正常工作 ^.*?\[(asc|desc|([a-zA-Z0-9]+,?)+?)\]$ 测试数据: hl[asc] dd[desc] pa[asc] ldka[1azqmrueq0081po5uc1g16jot,1azqmrueq0081po5uc1g16jot,default]

我正在为下面的构造与regex进行斗争。首选语言是Java

任何单词、方括号、asc或desc或任何其他由逗号分隔的字符串(但当有多个由逗号asc或desc分隔的单词不能出现时),方括号

我已经想出了这个办法,但它不能正常工作

^.*?\[(asc|desc|([a-zA-Z0-9]+,?)+?)\]$
测试数据:

hl[asc]
dd[desc]
pa[asc]
ldka[1azqmrueq0081po5uc1g16jot,1azqmrueq0081po5uc1g16jot,default]
poa[3oihkx5wfar7qu9nvqruhrn17]
ppa[dspxu1o2l06bzbh84m9luu701,f8ir6cuq4unhgi0a4kqjwidb0]
测试数据不匹配:

bb[asc,]
ca[desc,]
dd[asc,1azqmrueq0081po5uc1g16jot]
ge[1azqmrueq0081po5uc1g16jot,desc]

您可以使用负前瞻来断言方括号中的内容不包含后跟逗号和asc或desc的单词,反之亦然:

^(?![^[]+\[[^]]*(?:\w+,\s*\b(?:asc|desc)\b|\b(?:asc|desc)\b,\s*\w+)[^]]*\]).+$
在Java中:

String regex = "^(?![^\\[]+\\[[^]]*(?:\\w+,\\s*\\b(?:asc|desc)\\b|\\b(?:asc|desc)\\b,\\s*\\w+)[^]]*\\]).+$";

解释

  • ^
    断言字符串的开头
  • (?!
    负前瞻
  • [^[]+\[^]]*(?:\w+,(?:asc | desc)|(?:asc | desc),\w+[^]*.]
    详细信息:
    • [^[]+
      求反字符类,使其不匹配
      [
      1次以上
    • \[
      逐字匹配
    • [^]]*
      求反字符类以匹配非
      ]
      0+次
    • (?:
      非捕获组,交替匹配
      • \w+,\s*\b(?:asc | desc)\b
        匹配1+个单词字符,后跟逗号和asc或desc
      • |
      • \b(?:asc | desc)\b\s*\w+
        匹配asc或desc,后跟逗号和1+字字符
    • 关闭非捕获组
    • [^]]*
      求反字符类以匹配非
      ]
      0+次
    • \]
      按字面意思匹配
      ]
  • 关闭反向前瞻
  • +
    匹配任意字符1+次
  • $
    断言字符串的结尾

请展示输入和输出示例(测试数据)。有首选语言吗?选项可能因语言而异。什么是“asc”和“desc”?升序和降序在这里似乎很奇怪。谢谢你,但到目前为止,这是不可编译的,不过我们要检查一下,看看错误在哪里(结束括号比开始括号多)@aRagornol我已经更新了Java版本。有一个未被替换的
[
我已经添加了一个先生,你真的是正则表达式大师:)我需要研究它是如何工作的。非常感谢。如果你不介意的话,还有更多的问题吗?这可以重新处理以便返回组吗?就像组1括号前是什么,组2括号内是什么?@aRagornol当然,你可以使用2个捕获组:和。这使用了一个ne要匹配的选通字符类不是方括号内的换行符或
[]
。您始终可以将其更改为字符类,以指定允许匹配的内容。