2012-09-11 16 views
11

jak usunąć w teraźniejszości URL w przykładzie tekstu https://stackoverflow.com/posts/12684739/edit-submit/64cdc173-a15f-4a54-bfbb-6701a199642b String str = „psychoza strachu po #AssamRiots - http://t.co/LdEbWTgDhttp://t.co/mksVZKBz”;Usuwanie URL z tekstu przy użyciu języka Java

za pomocą wyrażenia regularnego.

Chcę usunąć cały adres URL w tekście. ale to nie działa

mój kod jest

String pattern = "(http(.*?)\\s)"; 
Pattern pt = Pattern.compile(pattern); 
Matcher namemacher = pt.matcher(input); 
if (namemacher.find()) { 
    str=input.replace(namemacher.group(0), ""); 
} 
+1

Nie rozumiem Twoje pytanie ... podać kilka przykładów – IProblemFactory

+0

Chcę usunąć adres URL, który przychodzi z tekstem. –

+0

Możesz sprawdzić ten post - http: // stackoverflow.com/questions/8694984/remove-part-of-string – Rohwedder

Odpowiedz

15

Wprowadź String który zawiera adres URL

private String removeUrl(String commentstr) 
    { 
     String urlPattern = "((https?|ftp|gopher|telnet|file|Unsure|http):((//)|(\\\\))+[\\w\\d:#@%/;$()~_?\\+-=\\\\\\.&]*)"; 
     Pattern p = Pattern.compile(urlPattern,Pattern.CASE_INSENSITIVE); 
     Matcher m = p.matcher(commentstr); 
     int i = 0; 
     while (m.find()) { 
      commentstr = commentstr.replaceAll(m.group(i),"").trim(); 
      i++; 
     } 
     return commentstr; 
    } 
+0

zadziałało idealnie :) – ir2pid

+0

Dzięki! Naprawdę świetne rozwiązanie. –

+0

po 3 do 4 godzin zrozumiałem, że twój kod nie działa –

4

Cóż, nie dostarczyły żadnych informacji na temat tekstu, więc przy założeniu tekst wygląda tak: "Some text here http://www.example.com some text there", można to zrobić:

String yourText = "blah-blah"; 
String cleartext = yourText.replaceAll("http.*?\\s", " "); 

Spowoduje to usunięcie wszystkich sekwencji rozpoczynających się od "http" i do pierwszej spacji.

Powinieneś przeczytać Javadoc na klasie String. To wszystko wyjaśni.

+2

Musi to być 'twójText.replaceAll (" http. *? \\ s "," ");' – Jaec

2

Jak definiujesz URL? Możesz nie tylko filtrować http: //, ale także https: // i inne protokoły, takie jak ftp: //, rss: // lub niestandardowe protokoły.

Może to wyrażenie regularne będzie wykonać zadanie:

[\S]+://[\S]+

wyjaśnienie:

  • jeden lub więcej nie-białych znaków
  • obserwowani przez ciąg ": //"
  • , po którym następuje co najmniej jeden nietylkowy numer
+0

Mam string #AssamRiots: Situation calm w Dhubri; cisza nocna zrelaksowana przez 2 godziny - codziennie Bhaskar http://t.co/ocq6RNFI –

+0

żadne moje zdanie nie kończy się białymi spacjami –

+0

Wyrażone przeze mnie wyrażenie regularne powinno również działać, gdy adres URL znajduje się na końcu wiadomości. Gdy po adresie URL nie ma białych spacji, dopasowuje się do końca wiadomości. Przynajmniej to działa na http://regexpal.com/ – Philipp

0

m.group(0) powinny zostać zastąpione pustym ciągiem zamiast m.group(i) gdzie i jest zwiększany przy każdym wywołaniu m.find() jak wspomniano w jednym z powyższych odpowiedzi.

private String removeUrl(String commentstr) 
{ 
    String urlPattern = "((https?|ftp|gopher|telnet|file|Unsure|http):((//)|(\\\\))+[\\w\\d:#@%/;$()~_?\\+-=\\\\\\.&]*)"; 
    Pattern p = Pattern.compile(urlPattern,Pattern.CASE_INSENSITIVE); 
    Matcher m = p.matcher(commentstr); 
    StringBuffer sb = new StringBuffer(commentstr.length); 
    while (m.find()) { 
     m.appendReplacement(sb, ""); 
    } 
    return sb.toString(); 
} 
1

Zauważ, że jeśli URL zawiera znaki takie jak & i \ następnie powyższych odpowiedzi nie będzie działać, ponieważ replaceAll nie obsługuje tych znaków. To, co zadziałało, to usunięcie tych znaków z nowej zmiennej łańcuchowej, a następnie usunięcie tych znaków z wyników m.find() i użycie replaceAll w mojej nowej zmiennej łańcuchowej.

private String removeUrl(String commentstr) 
{ 
    // rid of ? and & in urls since replaceAll can't deal with them 
    String commentstr1 = commentstr.replaceAll("\\?", "").replaceAll("\\&", ""); 

    String urlPattern = "((https?|ftp|gopher|telnet|file|Unsure|http):((//)|(\\\\))+[\\w\\d:#@%/;$()~_?\\+-=\\\\\\.&]*)"; 
    Pattern p = Pattern.compile(urlPattern,Pattern.CASE_INSENSITIVE); 
    Matcher m = p.matcher(commentstr); 
    int i = 0; 
    while (m.find()) { 
     commentstr = commentstr1.replaceAll(m.group(i).replaceAll("\\?", "").replaceAll("\\&", ""),"").trim(); 
     i++; 
    } 
    return commentstr; 
}  
0

Jeśli można przejść do pytona wtedy można znaleźć dużo lepsze rozwiązanie tutaj, podając te kodu

import re 
text = "<hello how are you ?> then ftp and mailto and gopher and file ftp://ideone.com/K3Cut rthen you " 
text = re.sub(r"ftp\S+", "", result) 
print(result) 
Powiązane problemy