如何使用Regex获取包含连续方括号中元素的字符串的子串?

时间:2016-01-21 18:27:06

标签: c# regex string

我有以下字符串: 一条规则:获取所有连续的方括号字符串:例如,

  

string 1:[hello] [qwqwe:] sdsdfsdf [note2]
string 2:   [somethingelse] sdfsdf [note 1]
string 3:aasdad [note 3]

我想获得子串:

  

输出1:[你好] [qwqwe:]
输出2:[somethingelse]
输出   3:

如果字符串没有方括号,我不想输出。 如果字符串有一个方括号分隔的字符串,该字符串不是连续的,那么它也不应该匹配。

我尝试使用正则表达式

  

([*])*

但它匹配两个方括号之间的所有内容。如果您注意到第一个字符串,我不需要违反我的规则的字符串部分。

4 个答案:

答案 0 :(得分:2)

方法1:将字符串start 处的多个连续[...]匹配为单个字符串

您需要使用以下正则表达式:

^(\[[^]]*])+

请参阅regex demo

^(\[[^]]*])+匹配:

  • ^ - 字符串的开头(在演示中,由于多线修改器,它在第一行匹配)
  • (\[[^]]*])+ - 被捕获到第1组(您可以通过.Groups[1].Captures集合访问所有这些值)一次或多次出现......
    • \[ - 文字[
    • [^]]* - 除]
    • 以外的零个或多个字符
    • ] - 文字]

C# code demo

var txt = "[hello][qwqwe:]sdsdfsdf [note2]";
var res = Regex.Match(txt, @"^(\[[^]]*])+"); // Run the single search
Console.WriteLine(res.Value); // Display the match
var captures = res.Groups[1].Captures.Cast<Capture>().Select(p => p.Value).ToList();
Console.WriteLine(string.Join(", ", captures)); // Display captures

方法2:在字符串开始分别匹配多个连续的[...]

您可以使用\G运算符:

\G\[[^]]*]

请参阅regex demo

它将匹配字符串开头的[...]子字符串,然后在每次成功匹配后匹配。

正则表达式解释

  • \G - 匹配字符串开头位置或每次成功匹配后的零宽度断言(锚点)
  • \[[^]]*] - 文字[\[)后跟零*以外的其他字符],后跟关闭{{ 1}}。

如果需要返回在字符串开头找到的所有]的单个字符串,则需要连接匹配项:

[...]

请参阅IDEONE demo

答案 1 :(得分:0)

你可以使用这个正则表达式。

^(\[(.*?)\])*

用于匹配的C#代码:

        var regex = new Regex(@"^(\[(.*?)\])*");

        var inputTexts = new string [] {"[abcd]xyz[pqrst]","abcd[xyz][pqr]","[asdf][abcd][qwer]sds[qwert]" };

        foreach (var match in inputTexts.Select(inputText => regex.Match(inputText)))
        {
            Console.WriteLine(match.Value);
        }           

        //result1 - [abcd]
        //result2 -
        //result3 - [asdf][abcd][qwer]

答案 2 :(得分:0)

您可以调整原始正则表达式中的四项内容以使其正常工作:1)使用非贪婪匹配.*?,2)添加^以匹配字符串的开头,3)逃避广场括号,以及4)将最终*更改为+,以至少需要一组方括号:

^(\[.*?\])+

答案 3 :(得分:-1)

试试这个,它适用于我的测试字符串。

^(\[[^\]]*(\]|\]\[))*

https://regex101.com/生成的解释:

1st Capturing group (\[[^\]]*(\]|\]\[))*
Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy]
Note: A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you're not interested in the data
\[ matches the character [ literally
[^\]]* match a single character not present in the list below
Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy]
\] matches the character ] literally
2nd Capturing group (\]|\]\[)
1st Alternative: \]
\] matches the character ] literally
2nd Alternative: \]\[
\] matches the character ] literally
\[ matches the character [ literally