我正在为以下构造而使用正则表达式。首选语言是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]
答案 0 :(得分:1)
您可以使用否定的前瞻来断定方括号之间的内容不包含单词,后跟逗号和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+
匹配升序或降序,后跟一个逗号和1个以上的字符)
关闭非捕获组[^]]*
否定的字符类别不匹配]
0次以上\]
从字面上匹配]
)
近距离否定预测.+
匹配任意字符1次以上$
声明字符串的结尾