从网址中删除字符,但使用正则表达式排除单词

时间:2015-04-03 16:19:44

标签: c# regex

我正在创建一个将处理网址的应用,此网址将包含多个细分(此细分可以包含特殊字符的名称),此过程将使用超过1000000个网址。

我不能单独替换每个段的特殊字符,因为这会使进程变慢。我的想法是使用{ - }或{0}加入网址的所有细分,并在一次调用中处理完整的网址。我将用/

替换{ - }
{-}Lake Havasu City{-}Kingman-area{-}Lake Ha/vasu City{-}North Pointe-by-Read Homes{-}hola{*e}s!fsd3$^gdfg% 

我有这个正则表达式试图获取特殊字符但排除特殊字

(?:(?<!")\{\-\}(?!"))|[^0-9a-zA-Z\s]

我得到了这个部分的特殊字符[^ 0-9a-zA-Z \ s],但我无法使表达式忽略{ - }

enter image description here

var url = @"{-}Lake Havasu City{-}Kingman-area{-}Lake Ha/vasu City{-}North Pointe-by-Read Homes{-}hola{*e}s!fsd3$^gdfg%";
var newUrl = RemoveSpecialCharacters(url).Replace("{-}","/")

public static string RemoveSpecialCharacters(string input)
{
    Regex r = new Regex("(?:(?<!")\{0\}(?!"))|[^0-9a-zA-Z\s]", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled);
    return r.Replace(input, " ");
}

结果必须是:

{-}Lake Havasu City{-}Kingman area{-}Lake Ha vasu City{-}North Pointe by Read Homes{-}hola e s fsd3 gdfg

由于

3 个答案:

答案 0 :(得分:1)

我想我终于修复了你的正则表达式。看看:我添加{-!来检查连字符是否在大括号{}之外正确匹配(非常感谢Regex Best Trick)。正则表达式(将与IgnoreCase选项一起使用)是:

[^0-9a-z\s{}-]|\{(?!\-\})|(?<!\{\-)\}|((?<!\{)?)\-(?(1)(?!\}))

一般情况下:我将{}-添加到否定的字符类中,这样我们就不会先检查它们,然后我添加了3个替代方案,我可以检查3上下文中的符号。最困难的部分是检查我们是否在花括号中有一个连字符,并且有可能使用条件表达式和一个捕捉组在后面......精神崩溃:)

以下是代码:

var InputText = @"{-}Lake Havasu City{-}Kingman-area{-}Lake Ha/vasu City{-}North Pointe-by-Read Homes{-}hola{*e}s{-!fsd3$^gdfg%";

var MyRegex = new Regex(@"[^0-9a-z\s{}-]|\{(?!\-\})|(?<!\{\-)\}|((?<!\{)?)\-(?(1)(?!\}))", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled);

var clean_str = MyRegex.Replace(InputText, string.Empty);

输出:

{-}Lake Havasu City{-}Kingmanarea{-}Lake Havasu City{-}North PointebyRead Homes{-}holaesfsd3gdfg

enter image description here

答案 1 :(得分:0)

你可以使用这样的正则表达式:

(\{-\})|([\w\s]+)|\W

<强> Working demo

并用\1\2替换您的内容。您可以在替换部分中看到输出结果:

enter image description here

答案 2 :(得分:0)

这是我得到的最接近的,不完全完美但有效

var re = @"(\{-\})|([^0-9a-zA-Z\s]+)";
var str = @"{-}Lake Havasu City{-}Kingman-area{-}Lake Ha/vasu City{-}North Pointe-by-Read Homes{-}hola{*e}s!fsd3$^gdfg%";
var subst = @"$1 ";
var r = new Regex(re, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled);
var result = r.Replace(str, subst).Replace("{-} ","/");