Bash

將正則表達式轉換為 bash 模式

  • November 17, 2021

我有以下正則表達式並想將它們轉換為 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 腳本BREERE.

如果您的意思是將 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表達式匹配-+和空字元串,以及諸如算術評估之類的數字019bash例如阻塞(作為無效的八進制數)。

另請注意,bash還可以使用其[[ $string =~ $regexp ]]運算符進行擴展的正則表達式模式匹配,或者當然呼叫任何可以進行正則表達式匹配的工具,例如grep, perl,或更高級的 shell awksed例如zshor ksh93… 畢竟,這就是 shell 的用途:執行命令。

引用自:https://unix.stackexchange.com/questions/677958