如何用Bash正则从后匹配连字符拆分指定格式字符串
Bash正则提取字符串两部分的可行方案
问题原因
Bash内置的=~匹配运算符使用POSIX扩展正则表达式(ERE)语法,不支持PCRE语法中的非捕获分组(?:...),这是原有代码失效的核心原因。
快速修复原有代码
仅需去掉正则中的非捕获组标记?:,即可正常匹配到第二部分内容:
test='blablabla-blebleble-bliblibli-1.2.3-xxx-1blo' # 去掉?:即可正常匹配 [[ $test =~ [^-]+(-[^-]+){2}$ ]] && echo ${BASH_REMATCH[0]} # 输出:1.2.3-xxx-1blo
最优实现:单次匹配同时提取两部分
批量处理场景下推荐用带捕获组的正则一次提取两部分内容,完全不需要额外调用外部命令,性能最高:
test='blablabla-blebleble-bliblibli-1.2.3-xxx-1blo' # 正则预先存入变量避免不同版本Bash的转义兼容问题 regex='^(.*)-([^-]+(-[^-]+){2})$' if [[ $test =~ $regex ]]; then part1=${BASH_REMATCH[1]} part2=${BASH_REMATCH[2]} echo "第一部分:$part1" echo "第二部分:$part2" fi
运行输出:
第一部分:blablabla-blebleble-bliblibli 第二部分:1.2.3-xxx-1blo
单独使用的两个正则
如果需要两个独立正则分别匹配两部分,可使用以下兼容写法:
- 匹配第一部分:使用正则
^(.*)-[^-]+(-[^-]+){2}$,提取第一个捕获组的内容即可 - 匹配第二部分:使用正则
[^-]+(-[^-]+){2}$,直接取全匹配内容即可
内容的提问来源于stack exchange,提问作者Fulalas
相关产品推荐
相关产品推荐

