Java 任何单词、方括号、asc或desc或任何其他由逗号、方括号分隔的字符串的正则表达式
我正在为下面的构造与regex进行斗争。首选语言是Java 任何单词、方括号、asc或desc或任何其他由逗号分隔的字符串(但当有多个由逗号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]
^.*?\[(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+次]
非捕获组,交替匹配(?:
匹配1+个单词字符,后跟逗号和asc或desc\w+,\s*\b(?:asc | desc)\b
或|
匹配asc或desc,后跟逗号和1+字字符\b(?:asc | desc)\b\s*\w+
关闭非捕获组)
求反字符类以匹配非[^]]*
0+次]
按字面意思匹配\]
]
关闭反向前瞻)
匹配任意字符1+次+
断言字符串的结尾$
请展示输入和输出示例(测试数据)。有首选语言吗?选项可能因语言而异。什么是“asc”和“desc”?升序和降序在这里似乎很奇怪。谢谢你,但到目前为止,这是不可编译的,不过我们要检查一下,看看错误在哪里(结束括号比开始括号多)@aRagornol我已经更新了Java版本。有一个未被替换的
[
我已经添加了一个先生,你真的是正则表达式大师:)我需要研究它是如何工作的。非常感谢。如果你不介意的话,还有更多的问题吗?这可以重新处理以便返回组吗?就像组1括号前是什么,组2括号内是什么?@aRagornol当然,你可以使用2个捕获组:和。这使用了一个ne要匹配的选通字符类不是方括号内的换行符或[]
。您始终可以将其更改为字符类,以指定允许匹配的内容。