將正則表達式轉換為 bash 模式
我有以下正則表達式並想將它們轉換為 bash 模式。
itg='^[-+]?[0-9]*$' fxp='^[-+]?[0-9]*[.,]?[0-9]+$' flp='^[-+]?[0-9]*[.,]?[0-9]+([eE][-+]?[0-9]+)?$'
我正在嘗試匹配數值
Integral Values 1 21 144 -17 Fixed point values 3.142 0.334 .345 -7.345 -0.34345 Floating point values 3.142E-2 43.234E+3 234.345e7
我正在使用 bash 腳本
BRE
或ERE
.
如果您的意思是將 regexp 轉換為 shell glob,請注意並非所有 regexp 運算符都可以轉換為 shell glob 運算符。例如, regexp 沒有標準的 glob 等效項
*
。不過,一些 shell 已經為此擴展了 glob 運算符。在
zsh
中,這#
只是在extendedglob
啟用該選項的情況下。在 ksh 中,相當於x*
is*(x)
。bash
,extglob
啟用該選項後,支持 ksh 擴展運算符的子集:@(...)
,?(...)
,*(...)
and+(...)
only (不是反向引用,~(...)
,\d
,\s
,{1,3}(...)
…)ksh93 的
printf
內置函式可以使用其%P
格式指令將擴展的%R
正則表達式轉換為 ksh glob(從 ksh glob 反向轉換為(ast-open 風味的)正則表達式)。如果幸運的話,您將能夠在以下位置使用生成的 glob
bash -O extglob
:$ itg='^[-+]?[0-9]*$' $ fxp='^[-+]?[0-9]*[.,]?[0-9]+$' $ flp='^[-+]?[0-9]*[.,]?[0-9]+([eE][-+]?[0-9]+)?$' $ ksh -c 'printf "%P\n" "$@"' ksh "$itg" "$fxp" "$flp" ?([-+])*([0-9]) ?([-+])*([0-9])?([.,])+([0-9]) ?([-+])*([0-9])?([.,])+([0-9])?([eE]?([-+])+([0-9]))
在這裡,你很幸運,它都是由
bash -O extglob
.在任何情況下,如果您打算將其用於輸入驗證,您需要更改
[0-9]
為[0123456789]
as[0-9]
in bash(以及當今大多數常見的語言環境)匹配比 10 0123456789 個多數百個字元的字元。另請注意,您的正則
itg
表達式匹配-
、+
和空字元串,以及諸如算術評估之類的數字019
,bash
例如阻塞(作為無效的八進制數)。另請注意,
bash
還可以使用其[[ $string =~ $regexp ]]
運算符進行擴展的正則表達式模式匹配,或者當然呼叫任何可以進行正則表達式匹配的工具,例如grep
,perl
,或更高級的 shellawk
,sed
例如zsh
orksh93
… 畢竟,這就是 shell 的用途:執行命令。