使用正则表达式匹配一组单词

时间:2016-03-15 18:43:26

标签: regex

我的格式为长字符串:

' Random Key         : Random Value\n Random Long Key     : Random Long Value\n...'

等等。 我想把它改成

Random Value:Random Key, Random Long Value:Random Long Key,...

使用正则表达式。我可以通过

匹配单个单词
\w+

但为了匹配我正在做的多个单词

\w+(\s\w+)*

但那并没有给我想要的结果。

3 个答案:

答案 0 :(得分:0)

您可以使用这段代码来查找键值对:

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        var regex = new Regex(@"\s*(?<key>(\w+\s?\w+)*)\s*:\s*(?<val>(\w+\s?\w+))\s*");
        var input = @" Key         : Value\n Long Key     : Long Value\n...";
        Console.WriteLine(regex.Replace(input, "${key}:${val}").Replace("\\n", ", "));
    }
}

技巧是匹配“任意数量(至少一个单词字符,一个可选空格,至少另一个单词字符)”,它为我们找到带空格的键。最短的无空格键虽然是两个字符。

我承认转义的换行符不会被正则表达式替换,但这样表达式和代码都非常简单。

答案 1 :(得分:0)

如果你的\n确实是字符串的一部分,你可以匹配并替换它:

/(?:\s*([^\\]+?)\s*:\s*([^\\]+?)\s*)+\\n/g

并用

代替
$1:$2,

See Demo

如果你逐行使用它,那么它就更容易了,因为你可以使用多行匹配:

/^\s*(.+?)\s*:\s*(.+?)\s*$/mg

并将其替换为

$1:$2,

See Demo

答案 2 :(得分:0)

其他答案都没有完全适合我,因为他们在最后一个词之后保持匹配。按预期工作的正则表达式是

(\w+(?:\s\w+)*)