java - 任何单词、方括号、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]
解决方案
您可以使用否定前瞻来断言方括号之间的内容不包含后跟逗号和 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 次以上$
断言字符串的结尾
推荐阅读
- php - example.com/wp-login.php 将我重定向到 example.com/example.com/wp-admin
- python - 将输入读入嵌套列表
- python - 基于另一个类python / django的启动增加一个类的变量
- sql - 使用 OVER 子句和 PARTITION BY 子句与计数器计算运行总计
- javascript - Office 任务窗格 window.open() -> 文档关闭时浏览器弹出窗口关闭
- javascript - Echarts.js:如何以编程方式激活画笔选择
- javascript - 循环遍历对象中的嵌套数组
- c# - MergeSort() 实现返回初始未排序数组
- html - 如何防止 2 列表格中的表格文本将其下方的单元格推到另一侧?
- angular6 - 如何检查innerformgroup状态即时角反应形式