【问题标题】:RegEx for matching characters in square brackets in bashRegEx用于匹配bash中方括号中的字符
【发布时间】:2019-09-26 15:12:18
【问题描述】:

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

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

我该如何解决这个问题?

【问题讨论】:

  • 因为它不是这样写的。

标签: regex string bash shell githooks


【解决方案1】:

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

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

Regex demo | Bash demo

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      更通用的正则表达式:

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

      还是这样

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

      【讨论】:

      • 不过,这也与 [///] 匹配。
      猜你喜欢
      • 1970-01-01
      • 2010-09-25
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2011-12-15
      相关资源
      最近更新 更多