我正在创建一个将处理网址的应用,此网址将包含多个细分(此细分可以包含特殊字符的名称),此过程将使用超过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],但我无法使表达式忽略{ - }
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
由于
答案 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
答案 1 :(得分:0)
答案 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("{-} ","/");