【问题标题】:Protecting the URL slash and get rid of other slashes in the text保护 URL 斜线并去掉文本中的其他斜线
【发布时间】:2014-08-28 01:24:46
【问题描述】:

我有一个这样的字符串

5 具 /Irish/ 移民 /'被霍乱谋杀和杀害'的尸体,而 在 1832 年修建铁路/http://www.bbc.com/news/

我尝试使用以下方法消除斜线

replaceAll("/","");

我得到的是

5 名爱尔兰移民的尸体“被霍乱杀害”,而 1832 年修建铁路到 http:www.bbc.comnews

我想保留 URL 斜线,但想去掉文本中的其他斜线。任何建议将不胜感激。

【问题讨论】:

  • 使用String.split分割字符串;然后遍历单词,如果不是 URL,则从其中删除“/”。您可以使用 URLValidator 检查 URL 是否有效,例如在 How to check for a valid URL in Java?
  • 这可能会帮助您\s/|/\s,这意味着任何/ 在之前或之后都有空间。或使其更精确(?<=\s)(/)|(/)(?=\s)。这是DEMO。最后总是考虑 url。在replaceAll() 方法中传递正则表达式。
  • 替换时无需分组/,请尝试(?<=\s)/|/(?=\s)

标签: java regex text


【解决方案1】:

这是一个病态的例子。请记住,正则表达式只是选择模式,所以最适合您的将取决于您的数据。

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

对于此示例,我建议将 URL 分开。如果您知道 URL 将始终位于末尾,则可以拆分字符串并仅对文本而不是 URL 运行替换。

这样的事情可能对你很有效。

String s 是我们病态的标题

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

这会保存除text 的网址之外的所有内容,仅保存url 的网址,然后清除text,并将网址附加到末尾。

【讨论】:

  • 这不是真的。正如我在文中提到的,只要 url 位于末尾,这就会起作用。但是,通过一些额外的代码,它可以适应将 url 恢复到任何位置。
  • 这就是我所说的,我说它适用于这个例子,但不是对所有人都通用
  • 再一次,我从那个开始。任何解决方案的有效性完全取决于数据格式。根据我们对数据的了解,这是可行的。如果我们能看到更多关于格式的信息,我会更新。
【解决方案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 并将其替换为自身。这将防止该 URL 中的斜线再次匹配(测试),因为它之前有空格或字符串开头,或者之后有空格或字符串结尾。
我的意思是形式的正则表达式

(matchesURL)|matchesSlashesAtStartOfWord|matchesSlashesAtEndOfWord

对于这种被(matchesURL) 匹配的正则表达式/ 将无法再次被matchesSlashesAtStartOfWord|matchesSlashesAtEndOfWord 匹配。

所以你可以使用类似的东西

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

它将首先匹配 url,将它们放入第 1 组,然后将它们替换为第 1 组 $1 的内容。由于正则表达式 (?&lt;=\\s|^)/|/(?=\\s|$) 的其他情况不能在第 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/

【讨论】:

    猜你喜欢
    • 2012-06-21
    • 1970-01-01
    • 2011-03-12
    • 2011-02-28
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    相关资源
    最近更新 更多