保护URL斜杠并删除文本中的其他斜杠

时间:2014-07-07 14:13:12

标签: java regex text

我有一个像这样的字符串

  

5 /爱尔兰/移民/被霍乱杀害和杀害的尸体   建造铁路/在1832年到http://www.bbc.com/news/

我尝试使用以下

删除斜杠
replaceAll("/","");

我得到的是

  

5名爱尔兰移民的尸体被霍乱杀害并被杀害   在1832年建造铁路到http:www.bbc.comnews

我想保留URL斜线,但想要删除文本中的其他斜杠。任何建议都将非常感谢。

2 个答案:

答案 0 :(得分:2)

这是一个病态的例子。请记住,Regexs只是选择模式,因此最适合您的模式将取决于您的数据。

例如,在您提供的字符串中,正则表达式:[^:/m]/就足够了。但是,这也忽略了任何文本中“m”之后的任何斜杠。这不是很好,除非你知道所有的斜线都不会在“m”之后。

对于此示例,我建议将URL分开。如果您知道URL总是在最后,您可以拆分字符串,只对文本而不是URL运行替换。

这样的事可能适合你。

字符串s是我们的病态标题

String text = s.replace("http.*","");
String url = s.replace(".*http","http");
text = text.replace("/","");
text = text + " " + url;

这会将除了网址的所有内容保存到text,只保存到url的网址,然后清除text,并将网址追加到最后。

答案 1 :(得分:2)

似乎您只想删除单词开头或结尾的斜杠。所以这样的斜线需要

  • 之前有空格
  • 之后有空格
  • 放置在字符串的开头
  • 放在字符串的末尾

此方法可能存在一个缺陷,即删除URL地址中的最后一个斜杠,如http://www.some.address/将成为http://www.some.address

如果您正在寻找这个,可以尝试使用look-around机制

replaceAll("(?<=\\s|^)/|/(?=\\s|$)", "")

会改变

Bodies of 5 /Irish/ immigrants /'murdered and killed by cholera' 
while building a railroad/ in 1832 to http://www.bbc.com/news/

进入

Bodies of 5 Irish immigrants 'murdered and killed by cholera' 
while building a railroad in 1832 to http://www.bbc.com/news
                                                            ^as you see it also 
                                                             removed last slash 
                                                             in this url

删除网址问题中的最后/的方法是首先使正则表达式匹配URL并将其替换为自身。这样可以防止此URL中的斜线再次匹配(测试),以便在OR之前有空格或字符串开头,或者在其后面有空格或字符串结尾。
我的意思是正则表达式

(matchesURL)|matchesSlashesAtStartOfWord|matchesSlashesAtEndOfWord
/匹配的此类正则表达式(matchesURL)

将无法再次与matchesSlashesAtStartOfWord|matchesSlashesAtEndOfWord匹配。

所以你可以使用像

这样的东西
replaceAll("(https?://[^/]+(/[^/]+)*/?)|(?<=\\s|^)/|/(?=\\s|$)", "$1")

首先匹配网址,将它们放入第1组,并将其替换为第1组$1的内容。由于正则表达式(?<=\\s|^)/|/(?=\\s|$)的其他情况无法在第1组中放置任何内容,因此对于{1}},$1将为空,因此您将无效替换此类/(您将删除它们)。

样本

String data = "Bodies of 5 /Irish/ immigrants /'murdered and killed by cholera' \r\nwhile building a railroad/ in 1832 to http://www.bbc.com/news/";
System.out.println(data);
System.out.println();
System.out.println(data.replaceAll("(https?://[^/]+(/[^/]+)*/?)|(?<=\\s|^)/|/(?=\\s|$)", "$1"));

输出

Bodies of 5 /Irish/ immigrants /'murdered and killed by cholera' 
while building a railroad/ in 1832 to http://www.bbc.com/news/

Bodies of 5 Irish immigrants 'murdered and killed by cholera' 
while building a railroad in 1832 to http://www.bbc.com/news/