用于匹配 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 "^\[([+*]|\+/\*|\*\/\+)\]"
^^^^ ^^^^^^
方括号之间匹配 +
可选地后跟 /*
,或 *
可选地后跟 /+
.
$ egrep -o '\[(\+(/\*)?|\*(/\+)?)\]' <<EOF
[+]
[/]
[*]
[+/*]
[*/*]
[/+*]
[*/+]
EOF
[+]
[*]
[+/*]
[*/+]
更通用的正则表达式:
lynx@bionic:~/$ echo "[*]..[*]..[+/*]..[*/+]" | egrep -o "\[([*/+]{1,3})\]"
[*]
[*]
[+/*]
[*/+]
或者这样
lynx@bionic:~$ echo "[*/+]" | grep -Po "(?<=\[)([*/+]{1,3})(?=\])"
*/+
我需要为一些带方括号的字符实现我的正则表达式:
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 "^\[([+*]|\+/\*|\*\/\+)\]"
^^^^ ^^^^^^
方括号之间匹配 +
可选地后跟 /*
,或 *
可选地后跟 /+
.
$ egrep -o '\[(\+(/\*)?|\*(/\+)?)\]' <<EOF
[+]
[/]
[*]
[+/*]
[*/*]
[/+*]
[*/+]
EOF
[+]
[*]
[+/*]
[*/+]
更通用的正则表达式:
lynx@bionic:~/$ echo "[*]..[*]..[+/*]..[*/+]" | egrep -o "\[([*/+]{1,3})\]"
[*]
[*]
[+/*]
[*/+]
或者这样
lynx@bionic:~$ echo "[*/+]" | grep -Po "(?<=\[)([*/+]{1,3})(?=\])"
*/+