我有一个 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