如何删除括号

如何删除括号

我有一个 RegEx,用于从实际配置如下的字符串中提取括号 [] 中的值:

[^\[]*(\[.*?\])[^\[]*
$1;

上面的正则表达式给了我以下输出,这主要是我需要的:

[Value1];[Value2];[Value3];

最后,我想要相同的值,但没有括号:

Value1;Value2;Value3;

有人能告诉我实现此目的的正确技巧吗?
我想这一定是一件小事。

答案1

如果我理解正确的话,您可以将该组定义(\[.*?\])\[(.*)?\]

答案2

由于您没有指定使用的工具,我猜它是类似于sed -E (或 sed -r,在 GNU-land 中)。我猜您输入了类似

The;quick brown;[fox];[jumps];[over];the;lazy dog.

你正在做的事情相当于

sed -E 's/[^\[]*(\[.*?\])[^\[]*/\1;/'

并获取输出

[fox];[jumps];[over];

— 但你想要

fox;jumps;over;

我相信您无法使用单个正则表达式(即单个替换命令)做到这一点。(我不能确定,因为我不知道您使用什么工具。)但您可以将多个单独的sed命令串联在一起调用——sed因此只需添加第二个替代命令来删除括号:

sed -E -e 's/[^\[]*(\[.*?\])[^\[]*/\1;/' -e 's/[][]//g'

如果价值观可以包含方括号,这也会将其删除。

请注意,至少对于sed,您不需要替换左侧的所有反斜杠:

sed -E -e 's/[^[]*(\[.*?])[^[]*/\1;/'    -e 's/[][]//g'

答案3

这个 perl 单行命令可以完成这个工作:

cat file.txt 
val11;val12;[val13];val14;[val15];[val16]
val21;val22;[val23];val24;[val25];[val26]

perl -ape 's/\[(.*?)\]|[^\[\]\r\n]*/{$1?$1.";":""}/eg' file.txt 
val13;val15;val16;
val23;val25;val26;

解释:

s/                  # substitute
    \[                  # opening square bracket
      (.*?)             # group 1, 0 or more any character but newline, not greedy
    \]                  # closing square bracket
  |                   # OR
    [^\[\]\r\n]*        # 0 or more any character that is NOT square brackets or linebreaks
/                   # With
    {                   # code
      $1?                 # if group 1 exists (i.e. thhere is something inside square brackets)
        $1.";"              # take it and add semicolon
      :                   # else
        ""                  # insert empty string
    }                   # end code
/eg                 # end substitute, eval code, global

相关内容