首页 > 解决方案 > 任何单词、方括号、asc OR desc 或任何其他由逗号、方括号分隔的字符串的正则表达式

问题描述

我正在为以下构造使用正则表达式。首选语言是 Java。

任何单词、方括号、asc OR 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]

标签: javaregex

解决方案


您可以使用否定前瞻来断言方括号之间的内容不包含后跟逗号和 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 次以上
  • $断言字符串的结尾

演示 Java


推荐阅读