将正则表达式转换为 bash 模式

将正则表达式转换为 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 脚本,使用BREor ERE

答案1

如果您的意思是将正则表达式转换为 shell glob,请注意并非所有正则表达式运算符都可以转换为 shell glob 运算符。例如,没有与 regexp 等效的标准 glob *

不过,有些 shell 为此扩展了全局运算符。在 中zsh#只有extendedglob启用该选项时才会出现这种情况。在 ksh 中,相当于x*。,启用该选项后支持 ksh 扩展运算符的子集:、、和only (不是反向引用、、、、...)*(x)bashextglob@(...)?(...)*(...)+(...)~(...)\d\s{1,3}(...)

ksh93 的printf内置函数可以使用其格式指令将扩展正则表达式转换为 ksh glob %P%R执行从 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]bash [0-9](以及当今大多数常见的语言环境)中的匹配字符,而不是 10 个 0123456789 的字符。

另请注意,您的itg正则表达式匹配-+和空字符串以及数字,例如019算术bash评估(作为无效的八进制数)。

另请注意,bash还可以与其[[ $string =~ $regexp ]]运算符进行扩展的正则表达式模式匹配,或者当然调用任何可以进行正则表达式匹配的工具,例如grepperlawksed更高级的 shell,例如zshksh93... 毕竟,这就是 shell 的用途:命令。

相关内容