正则表达式拆分字符串,并将括号[]放入数组中

时间:2013-10-22 04:10:01

标签: c# asp.net regex split

我正在尝试使用正则表达式将字符串拆分为2个数组,结果就像这样。

String str1 = "First Second [insideFirst] Third Forth [insideSecond] Fifth";

如何拆分str1以分成两个看起来像这样的数组:

ary1 = ['First Second','Third Forth','Fifth'];
ary2 = ['insideFirst','insideSecond'];

5 个答案:

答案 0 :(得分:2)

这是我的解决方案

string str = "First Second [insideFirst] Third Forth [insideSecond] Fifth";
MatchCollection matches = Regex.Matches(str,@"\[.*?\]");
string[] arr = matches.Cast<Match>()
                      .Select(m => m.Groups[0].Value.Trim(new char[]{'[',']'}))
                      .ToArray();
foreach (string s in arr)
{
    Console.WriteLine(s);
}

string[] arr1 = Regex.Split(str,@"\[.*?\]")
                     .Select(x => x.Trim())
                     .ToArray();
foreach (string s in arr1)
{
    Console.WriteLine(s);
}

<强>输出

insideFirst
insideSecond
First Second
Third Forth
Fifth

答案 1 :(得分:0)

Plz尝试下面的代码。它对我来说很好。

  String str1 = "First Second [insideFirst] Third Forth [insideSecond] Fifth";
    var output = String.Join(";", Regex.Matches(str1, @"\[(.+?)\]")
                                .Cast<Match>()
                                .Select(m => m.Groups[1].Value));

    string[] strInsideBreacket = output.Split(';');


    for (int i = 0; i < strInsideBreacket.Count(); i++)
    {
        str1 = str1.Replace("[", ";");
        str1 = str1.Replace("]", "");
        str1 = str1.Replace(strInsideBreacket[i], "");
    }

    string[] strRemaining = str1.Split(';');

Plz在调试代码时查看下面的输出屏幕截图:

enter image description here

enter image description here

下面, strInsideBreacket是像insideFirst和inSeideSecond一样的breacket值数组 和strRemaining是First Second,Third Forth和Fifth

的数组

由于

答案 2 :(得分:0)

试试这个解决方案,

 String str1 = "First Second [insideFirst] Third Forth [insideSecond] Fifth";
 var allWords = str1.Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries);
 var result = allWords.GroupBy(x => x.Contains("inside")).ToArray();

这个想法是,首先得到所有单词然后再将它分组。

答案 3 :(得分:0)

在我看来,“user2828970”用一个例子问了一个问题,而不是用他想要解析的文字文本。在我看来,他很可能会问这个问题:

  

我正在尝试使用正则表达式来拆分字符串。

var exampleSentence = "I had 185 birds but 20 of them flew away";
var regexSplit = Regex.Split(exampleSentence, @"\d+");
     

regexSplit的结果是:I hadbirds butof them flew away

     

但是,我还想知道导致第二个字符串与前一个文本分开的值,以及导致第三个字符串分裂的值来自前面的文字。即:我想知道18520

     

字符串可以是任何东西,分割的模式可以是任何东西。答案不应该有硬编码值。

嗯,这个简单的功能将执行该任务。可以优化代码以编译正则表达式,或者重新组织代码以返回多个集合或不同对象。但这(几乎)就是我在生产代码中使用它的方式。

public static List<Tuple<string, string>> RegexSplitDetail(this string text, string pattern)
{
    var splitAreas = new List<Tuple<string, string>>();

    var regexResult = Regex.Matches(text, pattern);
    var regexSplit = Regex.Split(text, pattern);

    for (var i = 0; i < regexSplit.Length; i++)
        splitAreas.Add(new Tuple<string, string>(i == 0 ? null : regexResult[i - 1].Value, regexSplit[i]));

    return splitAreas;
}

...
var result = exampleSentence.RegexSplitDetail(@"\d+");

这会返回一个如下所示的集合:

{ null, "I had "}, // First value, had no value splitting it from a predecessor
{"185", " birds but "}, // Second value, split from the preceding string by "185"
{ "20", " of them flew away"} // Third value, split from the preceding string by "20"

答案 4 :(得分:0)

由于这是一个.NET问题而且除了我在其他答案 中更受青睐的方法之外,您还可以通过另一种非常简单的方式捕获分割值。然后,您需要创建一个函数,以便根据需要使用结果。

var exampleSentence = "I had 185 birds but 20 of them flew away";
var regexSplit = Regex.Split(exampleSentence, @"(\d+)");

regexSplit的结果是:I had 185 birds but 20 ,{{1 }}。如您所见,拆分值存在于拆分结果中。

请注意与我的其他答案相比的细微差别。在这个正则表达式分割中,我在整个模式中使用了一个捕获组of them flew away 你不能这样做!!!?可以吗?

在拆分中使用捕获组将强制拆分结果捕获组之间的拆分值的所有捕获组。这可能会变得混乱,所以我不建议这样做。它还强迫某人使用你的函数知道他们必须将他们的正则表达式包装在一个捕获组中。