.NET正则表达式将字符串拆分为Word对

时间:2012-03-13 16:55:28

标签: .net regex

我有一个字符串“word1 word2 word3 word4 word5”

我想将其分成以下数组: “word1 word2”| “word2 word3”| “word3 word4”| “word4 word5”

我可以使用.NET分割和循环来完成它,但我宁愿用正则表达式使用Regex.Split

这是工作分裂和循环:

Dim keywordPairArr As String() = Regex.Split(Trim(keywords), "[ ]")
For i As Integer = 0 To keywordPairArr.Length - 2
    Dim keyword As String = keywordPairArr(i) & " " & keywordPairArr(i + 1)
    If Not keywordDictionary.ContainsKey(keyword) Then
        keywordDictionary.Add(keyword, Regex.Matches(keywords, "[" & keyword & "]+").Count)
    End If
Next

奖金:每个第N个单词都会很好。 N = 3将输出“word1 word2 word3”| “word2 word3 word4”| “word3 word4 word5”

正则表达式对每个Nth []分割字符串的帮助吗?

1 个答案:

答案 0 :(得分:2)

您可以使用Regex.Matches()执行此任务。

这是一个输出结果的C#示例:

void PrintWordGroups( string input, string pattern )
{
    MatchCollection mc = Regex.Matches( input.Trim(), pattern );
    foreach ( Match m in mc )
    {
        Trace.WriteLine( m.ToString() );
    }
}

void PrintGroupsOf2( string input )
{
    PrintWordGroups( input, @"([^\s]+\s+[^\s]+)\s*" );
}

void PrintGroupsOf3( string input )
{
    PrintWordGroups( input, @"(([^\s]+\s+){2}[^\s]+)\s*" );
}

void PrintGroupsOfN( string input, int n )
{
    string pattern = string.Format( @"(([^\s]+\s+){{{0}}}[^\s]+)\s*", n - 1 );
    PrintWordGroups( input, pattern );
}

<强>假设:

  • 单词由空格分隔。
  • 输入中的单词数必须是组中单词数的乘积(例如3个单词组的3,6,9,12等)。

模式说明:

  1. ([^\s]+\s+[^\s]+)\s* - 捕获word-&gt; whitespace-&gt; word-&gt;可选空格(可选,因为Trim()中的PrintWordGroups()操作导致最后一个表达式不具备该空格)。
  2. ([^\s]+\s+){2}表示:捕获word-&gt;空白两次,然后用另一个单词结束,然后是可选的空格。
  3. string.Format( @"(([^\s]+\s+){{{0}}}[^\s]+)\s*", n - 1 )
    这是捕获N-1个单词+空格然后用第N个单词和可选空格结束的一般情况。
    例如,如果n = 6,则格式化的字符串将为:(([^\s]+\s+){5}[^\s]+)\s*