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

时间:2019-05-08 20:07:13

标签: regex string bash shell githooks

我需要为带有方括号的某些字符实现正则表达式:
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 ~]#

您如何看待它在第一,第二和第三种变体中的工作原理。但它在最后的变体中不起作用。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

对于最后一条语句,您必须在alternation中添加另一个选项以使反转版本匹配。您可以将前两个选项组合到字符类中:

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

Regex demo | Bash demo

答案 1 :(得分:1)

方括号之间匹配+(可选)后跟/**(可选后跟/+)。

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

答案 2 :(得分:1)

更多通用正则表达式:

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

或者那样

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