如何用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
相关产品推荐
相关产品推荐

