正则表达式,用于任何单词,方括号,asc或desc或任何其他以逗号,方括号分隔的字符串

时间:2018-11-27 13:41:53

标签: java 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]

1 个答案:

答案 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+)[^]]*\\]).+$";

Regex demo

说明

  • ^声明字符串的开头
  • (?!负前瞻
  • [^[]+\[[^]]*(?:\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次以上
  • $声明字符串的结尾

Demo Java