如果此部分包含其他空格

时间:2017-03-17 11:12:18

标签: c# regex

我想将所有"12-12"替换为"12:00 AM - 12:00 AM"

为此,我创建了一些替换逻辑:

IDictionary<string, string> Replacements = new Dictionary<string, string>
{
    { "12-12".ToUpperInvariant(), "12:00 AM - 12:00 AM"}
};

Regex AliasReplacementRegex = new Regex(string.Join("|", Replacements.Keys),
    RegexOptions.Compiled | RegexOptions.IgnoreCase);

var input = AliasReplacementRegex.Replace(token, m => Replacements[m.Value.ToUpperInvariant()]);

其中token是参数。

在我的一个案例中,我输入的字符串如"Mo-Th: 12 - 12" 我怎么能匹配呢? 除了额外的空间,这几乎是我的期望? 除了将其添加到我的Regex规则之外,有没有其他选择?

UPD: 下次更新我的案例的正确解决方案吗?似乎它正在起作用,但也许某些案例将会破坏这一切。

Regex AliasReplacementRegex = new Regex(string.Join("|", Replacements.Keys),
        RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

1 个答案:

答案 0 :(得分:0)

您可以构建一个动态正则表达式来匹配输入文本中-周围的任何0+空白符号,然后使用“空格不敏感”键实现自定义IEqualityComparer以查找值:

public class WhitespaceInsensitiveComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        return string.Join("", x.Where(m => !char.IsWhiteSpace(m))) == string.Join("", y.Where(m => !char.IsWhiteSpace(m)));
    }

    public int GetHashCode(string x)
    {
        return string.Join("", x.Where(m => !char.IsWhiteSpace(m))).GetHashCode();
    }
}

然后

var token = "Mo-Th: 12 - 12";
var comparer = new WhitespaceInsensitiveComparer();
var Replacements = new Dictionary<string, string>(comparer);
Replacements.Add("12-12", "12:00 AM - 12:00 AM");
var AliasReplacementRegex = new Regex(string.Join("|", Replacements.Keys.Select(m => 
     Regex.Replace(m, @"\s*-\s*", @"\s*-\s*"))), RegexOptions.IgnoreCase);
var input = AliasReplacementRegex.Replace(token, m => Replacements[m.Value]);

查看C# demo online