【发布时间】:2016-04-28 06:26:29
【问题描述】:
string emailBody = " holla holla testing is for NewFinancial History:\"xyz\" dsd NewFinancial History:\"abc\" NewEBTDI$:\"abc\" dsds ";
emailBody = string.Join(" ", Regex.Split(emailBody.Trim(), @"(?:\r\n|\n|\r)"));
var keys = Regex.Matches(emailBody, @"\bNew\B(.+?):", RegexOptions.Singleline).OfType<Match>().Select(m => m.Groups[0].Value.Replace(":", "")).Distinct().ToArray();
foreach (string key in keys)
{
List<string> valueList = new List<string>();
string regex = "" + key + ":" + "\"(?<" + GetCleanKey(key) + ">[^\"]*)\"";
var matches = Regex.Matches(emailBody, regex, RegexOptions.Singleline);
foreach (Match match in matches)
{
if (match.Success)
{
string value = match.Groups[GetCleanKey(key)].Value;
if (!valueList.Contains(value.Trim()))
{
valueList.Add(value.Trim());
}
}
}
public string GetCleanKey(string key)
{
return key.Replace(" ", "").Replace("-", "").Replace("#", "").Replace("$", "").Replace("*", "").Replace("!", "").Replace("@", "")
.Replace("%", "").Replace("^", "").Replace("&", "").Replace("(", "").Replace(")", "").Replace("[", "").Replace("]", "").Replace("?", "")
.Replace("<", "").Replace(">", "").Replace("'", "").Replace(";", "").Replace("/", "").Replace("\"", "").Replace("+", "").Replace("~", "").Replace("`", "")
.Replace("{", "").Replace("}", "").Replace("+", "").Replace("|", "");
}
在我上面的代码中,我试图获取NewEBTDI$: 旁边的值,即"abc"。
当我在模式中包含$ 签名时,它不会搜索字段名称旁边的值。
如果$ 被删除,而其中一个只是指定NewEBTDI,那么它会搜索这些值。
我想搜索带有$ 符号的值。
【问题讨论】:
-
请妥善安排您的代码。不可读。
-
"$" 在 Regex 中具有特殊含义。用 \ 转义它。但在您的情况下,您将不得不执行 String.Replace() 方法,因为您的正则表达式已生成。您可能还有其他特殊字符...
标签: c# regex regex-lookarounds regex-greedy boost-regex