正则表达式匹配除[...]之间的所有内容

时间:2020-05-31 01:34:09

标签: c# regex

我正在寻找两个正则表达式,它们的字符串类似于以下内容:

I want [I] cAptUre this [don't] number [want to] 9 and [be captured] this Word

  • (A)仅返回每个[]中的字符串(包括括号)。我已经用\[(.*?)\]

  • 解决了这个问题
  • (B)返回[]内部的所有内容(括号从最终结果中排除)。因此与前一个相反。

预期结果:

  • (A)["[I]", "[don't]", "[want to]", "[be captured]"]
  • (B)"I want CaptUre this number 9 and this Word"

我该怎么办?

3 个答案:

答案 0 :(得分:1)

关于(A),您可以使用Match.Group和Gilles Quenot建议的模式@"(\[[^]]+\])"。 关于(B),您可以使用Regex.Replace替换文本括号:

var input = "I want[I]  cAptUre this[don't] number [want to] 9 and [be captured] this Word";
var pattern = @"(\[[^]]+\])";

var result = Regex.Replace(input, pattern, "");
Console.WriteLine(result);

输出为

I want  cAptUre this number  9 and  this Word

如果要避免输出中出现重复的空白,也可以替换它们:

result = Regex.Replace(result, @"(\s\s+)", " ");

答案 1 :(得分:1)

我对源字符串做了一些改动,以包括边缘情况:

[We] I want [I] cAptUre this [don't] number [want to] 9 and [be captured] this Word [89]

var without_brackets = Regex.Replace(s, @"\s*\[.*?\]\s*", " ").Trim();
var in_brackets = string.Join(" ", Regex.Matches(s, @"\[(.*?)\]")
                        .OfType<Match>()
                        .Select(m => m.Groups[1].Value));

WriteLine($"Without brackets: '{without_brackets}'");
WriteLine($"In brackets: '{in_brackets}'");

// Output:
// Without brackets: 'I want cAptUre this number 9 and this Word'
// In brackets:      'We I don't want to be captured 89'

不带括号

该模式在括号的两侧都搜索括号-并将其替换为空格。我使用*的量词作为\s的量词,以便在字符串的末尾和开头的方括号中包含单词的情况下包括边缘情况。另外,需要Trim才能删除边缘情况下的多余空间。

带括号

这很简单-搜索方括号中的所有内容,然后Join

答案 2 :(得分:0)

像这样的第一个要求:

(\[[^]]+\])

选中https://regex101.com/r/NdmSRF/1

对于第二个要求,不确定单独的正则表达式是否可以做到这一点,但是可以做到:

$ sed -E 's/\[[^]]+\]//g' file
I want   cAptUre this  number  9 and  this Word