給定以下輸入格式:
blablabla-blebleble-bliblibli-1.2.3-xxx-1blo
我想要 2 個正則運算式來獲得:
blablabla-blebleble-bliblibli1.2.3-xxx-1blo
不能保證第一部分 ('blablabla-blebleble-bliblibli') 總是有兩個 -,但 100% 肯定第二部分 (' 1.2.3-xxx-1blo') 總是有兩個-,并且在第一部分和第二部分之間總是有-
我設法做到了這一點,cut但對于大規模操作來說速度很慢。所以我希望使用 bash regex 可以提高性能。另外,我[^-] (?:-[^-] ){2}$在 regex101.com 中嘗試了這個并且它有效,但在 bash 中它沒有:
test='blablabla-blebleble-bliblibli-1.2.3-xxx-1blo'
[[ $test =~ [^-] (?:-[^-] ){2}$ ]]; echo $BASH_REMATCH
uj5u.com熱心網友回復:
?:用于在其他正則運算式中表示非捕獲組,但這在 bash 中似乎不起作用:https : //tldp.org/LDP/abs/html/x17129.html
沒有它試試:
[[ $test =~ [^-] (-[^-] ){2}$ ]] && echo matched=$BASH_REMATCH
印刷:
match=1.2.3-xxx-1blo
順便說一下,我使用了&&運算子并添加了額外的列印輸出來指示匹配操作是否成功。
編輯:
要獲得第一部分,您可以使用 bash 的字串剝離功能:https : //tldp.org/LDP/abs/html/refcards.html#AEN22828
[[ $test =~ [^-] (-[^-] ){2}$ ]]
second=$BASH_REMATCH
first=${test%-$second}
echo $first $second
印刷:
blablabla-blebleble-bliblibli 1.2.3-xxx-1blo
uj5u.com熱心網友回復:
請您嘗試以下操作:
str="blablabla-blebleble-bliblibli-1.2.3-xxx-1blo"
if [[ $str =~ ^(.*)-([^-] -[^-] -[^-] )$ ]]; then
echo "${BASH_REMATCH[1]}"
echo "${BASH_REMATCH[2]}"
fi
輸出:
blablabla-blebleble-bliblibli
1.2.3-xxx-1blo
BTWtest是保留的命令名,建議不要將其用作變數名。
uj5u.com熱心網友回復:
以下正則運算式,錨定到行尾將完成這項作業
(.*)-([^-]*(-[^-]*){2})$
在第一部分中,(.*)您匹配任何可以位于我們感興趣的字符之前的字串(它位于它旁邊并且是-分隔兩個組的字符)
第二部分([^-]*(-[^-]*){2})匹配不在組中的字符序列,-后跟兩個組 ( {2}) 的字符序列不同于-前面的-( -[^-]*)。
值得評論的是,該字串---將匹配,并將作為有效組“”和“--”回傳(您可以在此處的示例演示中對此進行測驗)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/314557.html
