我需要为带有方括号的某些字符实现正则表达式:
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 ~]#
您如何看待它在第一,第二和第三种变体中的工作原理。但它在最后的变体中不起作用。
我该如何解决这个问题?
答案 0 :(得分:2)
对于最后一条语句,您必须在alternation中添加另一个选项以使反转版本匹配。您可以将前两个选项组合到字符类中:
echo "[*/+]" | egrep -o "^\[([+*]|\+/\*|\*\/\+)\]"
^^^^ ^^^^^^
答案 1 :(得分:1)
方括号之间匹配+
(可选)后跟/*
或*
(可选后跟/+
)。
$ egrep -o '\[(\+(/\*)?|\*(/\+)?)\]' <<EOF
[+]
[/]
[*]
[+/*]
[*/*]
[/+*]
[*/+]
EOF
[+]
[*]
[+/*]
[*/+]
答案 2 :(得分:1)
更多通用正则表达式:
lynx@bionic:~/$ echo "[*]..[*]..[+/*]..[*/+]" | egrep -o "\[([*/+]{1,3})\]"
[*]
[*]
[+/*]
[*/+]
或者那样
lynx@bionic:~$ echo "[*/+]" | grep -Po "(?<=\[)([*/+]{1,3})(?=\])"
*/+