2015-04-03 77 views
1

我正在创建一个将处理url的应用程序,此url将有多个段(此段的名称可以有特殊字符),此过程将使用超过1000000网址。从URL中删除字符,但使用正则表达式排除一个字

我不能用分开的方式替换每个段的特殊字符,因为这会使过程变慢。我们的想法是加入的URL的所有段{ - }或{0}和过程在一个单一的call.The完整的URL我将取代{ - }用/

{-}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 

感谢

+0

谢谢你的问题,一个非常好的! – 2015-04-03 19:53:45

回答

0

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

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

Working demo

并替换内容无线th \1\2。你可以看到在置换部的输出结果:

enter image description here

+0

当我将它转换为C#不工作时 var re = @“/(\ { - \})|([\ w \ s] +)| \ W/g”; var str = @“{ - }哈瓦苏湖城{ - }金曼地区{ - }哈哈湖/瓦苏城{ - }北角Pointe-by-Read Homes { - } hola {* e} s!fsd3 $^gdfg %“; var subst = @“\ 1 \ 2”; var r = new Regex(re); var result = r.Replace(str,subst); – 2015-04-03 16:48:31

+0

@ user3334335会发生什么?什么是错误? – 2015-04-03 17:09:19

+0

错误是显而易见的:'re' var肯定是在JavaScript中,而不是C#。 – 2015-04-03 17:20:22

1

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

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

总的来说:我添加{}-到否定字符类,所以我们不首先检查他们,然后我加3层的替代品,我可以检查上下文中的3个符号。最困难的部分是检查一下大括号内是否有连字符,并且可以使用条件表达式和捕获组在外观后面...... Mind-breaking :)

这里是代码:

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

+0

真的很好,谢谢你的帮助 – 2015-04-06 03:21:02

+0

我们的答案在第一步中取得了同样的结果:'{ - }哈瓦苏湖城{ - }金马纳雷亚{ - }哈瓦苏湖市{ - }北部PointebyRead家{ - } holaesfsd3gdfg',唯一的区别是您用'$ 1 ',而我的需要一个空的替换字符串。 – 2015-04-17 10:11:14

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("{-} ","/"); 
相关问题