首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将正则表达式转换为bash模式

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

Unix & Linux用户
提问于 2021-11-17 16:24:08
回答 1查看 877关注 0票数 1

我有以下正则表达式,并希望将它们转换为bash模式。

代码语言:javascript
复制
itg='^[-+]?[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我使用的是使用BRE或ERE的bash脚本。
fxp='^[-+]?[0-9]*[.,]?[0-9]+我正在尝试匹配数值。A1我使用的是使用D2或D3的bash脚本。
flp='^[-+]?[0-9]*[.,]?[0-9]+([eE][-+]?[0-9]+)?我正在尝试匹配数值。A1我使用的是使用D2或D3的bash脚本。

我正在尝试匹配数值。

A1

我使用的是使用D2D3的bash脚本。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-11-17 16:38:28

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

然而,一些shell扩展了glob操作符。在zsh中,只有在启用extendedglob选项时才是#。在ksh中,相当于x*的是*(x)。启用bash选项后,只支持ksh扩展运算符的子集:@(...)?(...)*(...)+(...) (不支持反向引用、~(...)\d\s{1,3}(...).)

ksh 93‘S printf内置可以通过其%P格式指令将扩展的regexp转换为ksh globs (%R做从ksh glob到(完全开放风味的)regexp的反向转换)。

如果幸运的话,您将能够在bash -O extglob中使用结果glob:

代码语言:javascript
复制
$ itg='^[-+]?[0-9]*在这里,您很幸运,它都是由bash -O extglob支持的regexp操作符。在任何情况下,如果要使用它进行输入验证,则需要将[0-9]更改为[0123456789]作为bash中的[0-9] (以及当今大多数常见的语言环境中的D24),匹配的字符比10 0123456789个字符多数百个。还请注意,您的itg regexp匹配-、+和空字符串,以及例如bash算术计算所占用的019等数字(作为无效的八进制数字)。还请注意,bash还可以与其[[ $string =~ $regexp ]]运算符进行扩展的regexp模式匹配,当然也可以调用任何可以进行regexp匹配的工具,如grep、perl、awk、sed或更高级的shell,如zsh或ksh93.毕竟,这就是shell的目的:运行命令。
$ fxp='^[-+]?[0-9]*[.,]?[0-9]+在这里,您很幸运,它都是由D21支持的regexp操作符。在任何情况下,如果要使用它进行输入验证,则需要将D22更改为D23作为bash中的D24 (以及当今大多数常见的语言环境中的D24),匹配的字符比10 0123456789个字符多数百个。还请注意,您的D25 regexp匹配D26、D27和空字符串,以及例如D29算术计算所占用的D28等数字(作为无效的八进制数字)。还请注意,D30还可以与其D31运算符进行扩展的regexp模式匹配,当然也可以调用任何可以进行regexp匹配的工具,如D32、D33、D34、D35或更高级的shell,如D36或D37.毕竟,这就是shell的目的:运行命令。
$ flp='^[-+]?[0-9]*[.,]?[0-9]+([eE][-+]?[0-9]+)?在这里,您很幸运,它都是由D21支持的regexp操作符。在任何情况下,如果要使用它进行输入验证,则需要将D22更改为D23作为bash中的D24 (以及当今大多数常见的语言环境中的D24),匹配的字符比10 0123456789个字符多数百个。还请注意,您的D25 regexp匹配D26、D27和空字符串,以及例如D29算术计算所占用的D28等数字(作为无效的八进制数字)。还请注意,D30还可以与其D31运算符进行扩展的regexp模式匹配,当然也可以调用任何可以进行regexp匹配的工具,如D32、D33、D34、D35或更高级的shell,如D36或D37.毕竟,这就是shell的目的:运行命令。
$ ksh -c 'printf "%P\n" "$@"' ksh "$itg" "$fxp" "$flp"
?([-+])*([0-9])
?([-+])*([0-9])?([.,])+([0-9])
?([-+])*([0-9])?([.,])+([0-9])?([eE]?([-+])+([0-9]))

在这里,您很幸运,它都是由D21支持的regexp操作符。

在任何情况下,如果要使用它进行输入验证,则需要将D22更改为D23作为bash中的D24 (以及当今大多数常见的语言环境中的D24),匹配的字符比10 0123456789个字符多数百个。

还请注意,您的D25 regexp匹配D26D27和空字符串,以及例如D29算术计算所占用的D28等数字(作为无效的八进制数字)。

还请注意,D30还可以与其D31运算符进行扩展的regexp模式匹配,当然也可以调用任何可以进行regexp匹配的工具,如D32D33D34D35或更高级的shell,如D36D37.毕竟,这就是shell的目的:运行命令。

票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/677958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档