我正在尝试编写一个正则表达式,它将从分隔列表中提取干净的值。问题在于列表可以用不同的符号或单词分隔。捕获的值将在代码中进行修剪,因此空格无关紧要。
输入:
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
视为分隔符。
答案 0 :(得分:1)
我认为没有必要在这里使用Regex:
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);
答案 1 :(得分:1)
这就是我提出的:
\A(?:(?<Value>(?:[^,;&*\s]|\s(?!and))+)(?:(?:and|[,;&\s*])*))*\Z
<强>解释强>
(?:...)
是一个非捕获组,不会更改匹配,只是不将结果存储在组中。
(?!...)
为负前瞻,如果后面的字符与给定的模式不匹配,则匹配。
基本上,如果“和”不跟随它,它只会将空白作为Value
的一部分进行匹配,并且它在分隔符中包含“和”。
这看起来非常复杂,您可能希望用分隔符替换" and "
并使用当前表达式。
答案 2 :(得分:0)
或者只是按照目前的结果执行此操作:
desiredResult = currentResult.Replace("and", ",");