用于匹配 bash 中方括号中字符的正则表达式

RegEx for matching characters in square brackets in bash

我需要为一些带方括号的字符实现我的正则表达式:
1) [+] 对于这个
2) [*] 为此
3) [+/*] 为此
4) [*/+] 并且为此

我在 bash 上做了这个:

[root@testmachine5 ~]# echo "[+]" | egrep -o "^\[(\+|\*|\+/\*)\]"
[+]
[root@testmachine5 ~]# echo "[*]" | egrep -o "^\[(\+|\*|\+/\*)\]"
[*]
[root@testmachine5 ~]# echo "[+/*]" | egrep -o "^\[(\+|\*|\+/\*)\]"
[+/*]
[root@testmachine5 ~]# echo "[*/+]" | egrep -o "^\[(\+|\*|\+/\*)\]"
[root@testmachine5 ~]#

你怎么看,它在第一、第二和第三个变体中起作用。但它在最后一个变体中不起作用。

如何解决这个问题?

对于最后一条语句,您必须在 alternation 中添加另一个选项才能匹配反向版本。您可以将前 2 个选项组合成一个字符 class:

echo "[*/+]" | egrep -o "^\[([+*]|\+/\*|\*\/\+)\]"
                             ^^^^       ^^^^^^ 

Regex demo | Bash demo

方括号之间匹配 + 可选地后跟 /*,或 * 可选地后跟 /+.

$ egrep -o '\[(\+(/\*)?|\*(/\+)?)\]' <<EOF
[+]
[/]
[*]
[+/*]
[*/*]
[/+*]
[*/+]
EOF
[+]
[*]
[+/*]
[*/+]

更通用的正则表达式:

lynx@bionic:~/$ echo "[*]..[*]..[+/*]..[*/+]" | egrep -o "\[([*/+]{1,3})\]"
[*]
[*]
[+/*]
[*/+]

或者这样

lynx@bionic:~$ echo "[*/+]" | grep -Po "(?<=\[)([*/+]{1,3})(?=\])"
*/+