You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Bash正则提取字符串中括号前不含末尾点的前缀?

Bash正则提取不含末尾点的前缀部分

核心正则表达式

使用以下正则可直接捕获到不含末尾点的blah.blah.blah部分:

^([^.\[\(]+(?:\.[^.\[\(]+)*)

正则逻辑说明

  • ^:从字符串起始位置匹配,避免匹配中间无关内容
  • [^.\[\(]+:匹配至少一个不是点、左方括号、左圆括号的字符,确保不会误吞分隔符前的点
  • (?:\.[^.\[\(]+)*:非捕获组,匹配零或多组「点+非分隔符字符」,用来匹配带点的多段前缀(比如blah.blah.blah)
  • 整个捕获组会精准停在第一个(或[的前一个字符,不会包含末尾的点

测试示例

处理无引号的字符串

target_str="blah.blah.blah.(hi.there).[la.la].la.ext"
if [[ $target_str =~ ^([^.\[\(]+(?:\.[^.\[\(]+)*) ]]; then
  echo "捕获结果:${BASH_REMATCH[1]}"
fi

输出:捕获结果:blah.blah.blah

处理带单引号的字符串

先去除首尾单引号再匹配:

quoted_str="'blah.blah.blah.[hi.there].(la.la).la.ext'"
trimmed_str=${quoted_str:1:-1}
if [[ $trimmed_str =~ ^([^.\[\(]+(?:\.[^.\[\(]+)*) ]]; then
  echo "捕获结果:${BASH_REMATCH[1]}"
fi

输出:捕获结果:blah.blah.blah

原正则问题分析

你之前使用的([^\[\(]*)会包含末尾的点,原因是该正则仅排除了[和(,未排除点字符,因此会将第一个(/[之前的所有字符(包括最后一个点)全部匹配进去。

内容的提问来源于stack exchange,提问作者quimm2003

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:48:19