0

我正在尝试编写一个正则表达式,它将从分隔列表中提取干净的值。问题是列表可以由不同的符号或单词分隔。捕获的值将在代码中进行修剪,因此空格无关紧要。

输入:

English (UK), French* , German and Polish  & Russian; Portugese and Italian

我到目前为止的正则表达式:

\A(?:(?<Value>[^,;&*]+)[,;&\s*]*)*\Z

我期待的分隔符是,;&. 我包括了,*因为我希望它从捕获的值中排除。

捕获的值:

English (UK), French, German and Polish, Russian, Portugese and Italian

预期值:

English (UK), French, German, Polish, Russian, Portugese, Italian

我遇到的问题是我不能and被视为分隔符。

4

3 回答 3

1

我认为这里没有必要使用正则表达式:

    string str = "English (UK), French* , German and Polish  & Russian; Portugese and Italian";
    string[] results = str.Split(new string[] { ",", ";", "&", "*" }, StringSplitOptions.RemoveEmptyEntries);
    foreach (string s in results)
        if (!string.IsNullOrWhiteSpace(s))
            Console.WriteLine(s);
于 2013-09-17T09:56:33.903 回答
1

这就是我想出的:

\A(?:(?<Value>(?:[^,;&*\s]|\s(?!and))+)(?:(?:and|[,;&\s*])*))*\Z

解释:

(?:...)是一个非捕获组,不改变匹配,只是不将结果存储在一个组中。

(?!...)是负前瞻,如果后面的字符与给定的模式不匹配,则匹配。

基本上,这仅匹配空格作为Value如果“and”不跟随它的一部分,并且它在分隔符中包含“and”。

这看起来非常复杂,您可能希望" and "用分隔符替换并使用您当前的表达式。

测试

于 2013-09-17T10:02:10.873 回答
0

或者只是对您当前的结果执行此操作:

desiredResult = currentResult.Replace("and", ",");
于 2013-09-17T09:59:03.947 回答