Регулярное выражение для URL-адресов в Java -- java поле с участием regex поле с участием regexbuddy пол Связанный проблема

Regular expression to match URLs in Java


87
vote

проблема

русский
<Р> Я использую RegexBuddy при работе с регулярными выражениями. Из своей библиотеки я скопировал регулярное выражение для URL-адресов. Я успешно протестирована в RegexBuddy. Однако, когда я скопировал его как Java <код> String ароматизатора и вставить его в Java код, он не работает. Следующий класс печатает <код> false :
 <код> public class RegexFoo {      public static void main(String[] args) {         String regex = "\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]";         String text = "http://google.com";         System.out.println(IsMatch(text,regex)); }      private static boolean IsMatch(String s, String pattern) {         try {             Pattern patt = Pattern.compile(pattern);             Matcher matcher = patt.matcher(s);             return matcher.matches();         } catch (RuntimeException e) {         return false;     }        }    }   

кто-нибудь знает, что я делаю не так?

Английский оригинал

I use RegexBuddy while working with regular expressions. From its library I copied the regular expression to match URLs. I tested successfully within RegexBuddy. However, when I copied it as Java String flavor and pasted it into Java code, it does not work. The following class prints false:

public class RegexFoo {      public static void main(String[] args) {         String regex = "\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]";         String text = "http://google.com";         System.out.println(IsMatch(text,regex)); }      private static boolean IsMatch(String s, String pattern) {         try {             Pattern patt = Pattern.compile(pattern);             Matcher matcher = patt.matcher(s);             return matcher.matches();         } catch (RuntimeException e) {         return false;     }        }    } 

Does anyone know what I am doing wrong?

</div
        
     
     

Список ответов

107
 
vote
vote
Лучший ответ
 

Попробуйте следующую строку REGEX. Ваш тест, вероятно, был сделан в чувствительном к регистру. Я добавил строчные буквы, а также правильный наступитель строки.

 <код> String regex = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";   

Это тоже работает:

 <код> String regex = "\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";   

Примечание:

 <код> String regex = "<\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]>"; // matches <http://google.com>  String regex = "<^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]>"; // does not match <http://google.com>   
 

Try the following regex string instead. Your test was probably done in a case-sensitive manner. I have added the lowercase alphas as well as a proper string beginning placeholder.

String regex = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"; 

This works too:

String regex = "\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"; 

Note:

String regex = "<\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]>"; // matches <http://google.com>  String regex = "<^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]>"; // does not match <http://google.com> 
</div
 
 
         
         
96
 
vote

Лучший способ сделать это сейчас:

 <код> NSLog(@"Response ==> %@" ,encodedString);          UIWebView *webView;         webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0, 320, 470)];         [webView setDelegate:self];          NSString *urlAddress = encodedString;         NSURL *url1 = [NSURL URLWithString:urlAddress];         NSURLRequest *requestObj = [NSURLRequest requestWithURL:url1];         NSLog(@"url1 ==> %@" ,url1);         [webView loadRequest:requestObj];         [[self view] addSubview:webView]; 0  

Редактировать: код <код> NSLog(@"Response ==> %@" ,encodedString); UIWebView *webView; webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0, 320, 470)]; [webView setDelegate:self]; NSString *urlAddress = encodedString; NSURL *url1 = [NSURL URLWithString:urlAddress]; NSURLRequest *requestObj = [NSURLRequest requestWithURL:url1]; NSLog(@"url1 ==> %@" ,url1); [webView loadRequest:requestObj]; [[self view] addSubview:webView]; 1 из https://github.com/android/platform_frameworks_base/blob/master/core/java/android/util/patterns.java :

 <код> NSLog(@"Response ==> %@" ,encodedString);          UIWebView *webView;         webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0, 320, 470)];         [webView setDelegate:self];          NSString *urlAddress = encodedString;         NSURL *url1 = [NSURL URLWithString:urlAddress];         NSURLRequest *requestObj = [NSURLRequest requestWithURL:url1];         NSLog(@"url1 ==> %@" ,url1);         [webView loadRequest:requestObj];         [[self view] addSubview:webView]; 2  
 

The best way to do it now is:

android.util.Patterns.WEB_URL.matcher(linkUrl).matches(); 

EDIT: Code of Patterns from https://github.com/android/platform_frameworks_base/blob/master/core/java/android/util/Patterns.java :

/*  * Copyright (C) 2007 The Android Open Source Project  *  * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *  *      http://www.apache.org/licenses/LICENSE-2.0  *  * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */  package android.util;  import java.util.regex.Matcher; import java.util.regex.Pattern;  /**  * Commonly used regular expression patterns.  */ public class Patterns {     /**      *  Regular expression to match all IANA top-level domains.      *  List accurate as of 2011/07/18.  List taken from:      *  http://data.iana.org/TLD/tlds-alpha-by-domain.txt      *  This pattern is auto-generated by frameworks/ex/common/tools/make-iana-tld-pattern.py      *      *  @deprecated Due to the recent profileration of gTLDs, this API is      *  expected to become out-of-date very quickly. Therefore it is now      *  deprecated.      */     @Deprecated     public static final String TOP_LEVEL_DOMAIN_STR =         "((aero|arpa|asia|a[cdefgilmnoqrstuwxz])"         + "|(biz|b[abdefghijmnorstvwyz])"         + "|(cat|com|coop|c[acdfghiklmnoruvxyz])"         + "|d[ejkmoz]"         + "|(edu|e[cegrstu])"         + "|f[ijkmor]"         + "|(gov|g[abdefghilmnpqrstuwy])"         + "|h[kmnrtu]"         + "|(info|int|i[delmnoqrst])"         + "|(jobs|j[emop])"         + "|k[eghimnprwyz]"         + "|l[abcikrstuvy]"         + "|(mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])"         + "|(name|net|n[acefgilopruz])"         + "|(org|om)"         + "|(pro|p[aefghklmnrstwy])"         + "|qa"         + "|r[eosuw]"         + "|s[abcdeghijklmnortuvyz]"         + "|(tel|travel|t[cdfghjklmnoprtvwz])"         + "|u[agksyz]"         + "|v[aceginu]"         + "|w[fs]"         + "|(u03b4u03bfu03bau03b9u03bcu03ae|u0438u0441u043fu044bu0442u0430u043du0438u0435|u0440u0444|u0441u0440u0431|u05d8u05e2u05e1u05d8|u0622u0632u0645u0627u06ccu0634u06cc|u0625u062eu062au0628u0627u0631|u0627u0644u0627u0631u062fu0646|u0627u0644u062cu0632u0627u0626u0631|u0627u0644u0633u0639u0648u062fu064au0629|u0627u0644u0645u063au0631u0628|u0627u0645u0627u0631u0627u062a|u0628u06beu0627u0631u062a|u062au0648u0646u0633|u0633u0648u0631u064au0629|u0641u0644u0633u0637u064au0646|u0642u0637u0631|u0645u0635u0631|u092au0930u0940u0915u094du0937u093e|u092du093eu0930u0924|u09adu09beu09b0u09a4|u0a2du0a3eu0a30u0a24|u0aadu0abeu0ab0u0aa4|u0b87u0ba8u0bcdu0ba4u0bbfu0bafu0bbe|u0b87u0bb2u0b99u0bcdu0b95u0bc8|u0b9au0bbfu0b99u0bcdu0b95u0baau0bcdu0baau0bc2u0bb0u0bcd|u0baau0bb0u0bbfu0b9fu0bcdu0b9au0bc8|u0c2du0c3eu0c30u0c24u0c4d|u0dbdu0d82u0d9au0dcf|u0e44u0e17u0e22|u30c6u30b9u30c8|u4e2du56fd|u4e2du570b|u53f0u6e7e|u53f0u7063|u65b0u52a0u5761|u6d4bu8bd5|u6e2cu8a66|u9999u6e2f|ud14cuc2a4ud2b8|ud55cuad6d|xn\-\-0zwm56d|xn\-\-11b5bs3a9aj6g|xn\-\-3e0b707e|xn\-\-45brj9c|xn\-\-80akhbyknj4f|xn\-\-90a3ac|xn\-\-9t4b11yi5a|xn\-\-clchc0ea0b2g2a9gcd|xn\-\-deba0ad|xn\-\-fiqs8s|xn\-\-fiqz9s|xn\-\-fpcrj9c3d|xn\-\-fzc2c9e2c|xn\-\-g6w251d|xn\-\-gecrj9c|xn\-\-h2brj9c|xn\-\-hgbk6aj7f53bba|xn\-\-hlcj6aya9esc7a|xn\-\-j6w193g|xn\-\-jxalpdlp|xn\-\-kgbechtv|xn\-\-kprw13d|xn\-\-kpry57d|xn\-\-lgbbat1ad8j|xn\-\-mgbaam7a8h|xn\-\-mgbayh7gpa|xn\-\-mgbbh1a71e|xn\-\-mgbc0a9azcg|xn\-\-mgberp4a5d4ar|xn\-\-o3cw4h|xn\-\-ogbpf8fl|xn\-\-p1ai|xn\-\-pgbs0dh|xn\-\-s9brj9c|xn\-\-wgbh1c|xn\-\-wgbl6a|xn\-\-xkc2al3hye2a|xn\-\-xkc2dl3a5ee0h|xn\-\-yfro4i67o|xn\-\-ygbi2ammx|xn\-\-zckzah|xxx)"         + "|y[et]"         + "|z[amw])";      /**      *  Regular expression pattern to match all IANA top-level domains.      *  @deprecated This API is deprecated. See {@link #TOP_LEVEL_DOMAIN_STR}.      */     @Deprecated     public static final Pattern TOP_LEVEL_DOMAIN =         Pattern.compile(TOP_LEVEL_DOMAIN_STR);      /**      *  Regular expression to match all IANA top-level domains for WEB_URL.      *  List accurate as of 2011/07/18.  List taken from:      *  http://data.iana.org/TLD/tlds-alpha-by-domain.txt      *  This pattern is auto-generated by frameworks/ex/common/tools/make-iana-tld-pattern.py      *      *  @deprecated This API is deprecated. See {@link #TOP_LEVEL_DOMAIN_STR}.      */     @Deprecated     public static final String TOP_LEVEL_DOMAIN_STR_FOR_WEB_URL =         "(?:"         + "(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])"         + "|(?:biz|b[abdefghijmnorstvwyz])"         + "|(?:cat|com|coop|c[acdfghiklmnoruvxyz])"         + "|d[ejkmoz]"         + "|(?:edu|e[cegrstu])"         + "|f[ijkmor]"         + "|(?:gov|g[abdefghilmnpqrstuwy])"         + "|h[kmnrtu]"         + "|(?:info|int|i[delmnoqrst])"         + "|(?:jobs|j[emop])"         + "|k[eghimnprwyz]"         + "|l[abcikrstuvy]"         + "|(?:mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])"         + "|(?:name|net|n[acefgilopruz])"         + "|(?:org|om)"         + "|(?:pro|p[aefghklmnrstwy])"         + "|qa"         + "|r[eosuw]"         + "|s[abcdeghijklmnortuvyz]"         + "|(?:tel|travel|t[cdfghjklmnoprtvwz])"         + "|u[agksyz]"         + "|v[aceginu]"         + "|w[fs]"         + "|(?:u03b4u03bfu03bau03b9u03bcu03ae|u0438u0441u043fu044bu0442u0430u043du0438u0435|u0440u0444|u0441u0440u0431|u05d8u05e2u05e1u05d8|u0622u0632u0645u0627u06ccu0634u06cc|u0625u062eu062au0628u0627u0631|u0627u0644u0627u0631u062fu0646|u0627u0644u062cu0632u0627u0626u0631|u0627u0644u0633u0639u0648u062fu064au0629|u0627u0644u0645u063au0631u0628|u0627u0645u0627u0631u0627u062a|u0628u06beu0627u0631u062a|u062au0648u0646u0633|u0633u0648u0631u064au0629|u0641u0644u0633u0637u064au0646|u0642u0637u0631|u0645u0635u0631|u092au0930u0940u0915u094du0937u093e|u092du093eu0930u0924|u09adu09beu09b0u09a4|u0a2du0a3eu0a30u0a24|u0aadu0abeu0ab0u0aa4|u0b87u0ba8u0bcdu0ba4u0bbfu0bafu0bbe|u0b87u0bb2u0b99u0bcdu0b95u0bc8|u0b9au0bbfu0b99u0bcdu0b95u0baau0bcdu0baau0bc2u0bb0u0bcd|u0baau0bb0u0bbfu0b9fu0bcdu0b9au0bc8|u0c2du0c3eu0c30u0c24u0c4d|u0dbdu0d82u0d9au0dcf|u0e44u0e17u0e22|u30c6u30b9u30c8|u4e2du56fd|u4e2du570b|u53f0u6e7e|u53f0u7063|u65b0u52a0u5761|u6d4bu8bd5|u6e2cu8a66|u9999u6e2f|ud14cuc2a4ud2b8|ud55cuad6d|xn\-\-0zwm56d|xn\-\-11b5bs3a9aj6g|xn\-\-3e0b707e|xn\-\-45brj9c|xn\-\-80akhbyknj4f|xn\-\-90a3ac|xn\-\-9t4b11yi5a|xn\-\-clchc0ea0b2g2a9gcd|xn\-\-deba0ad|xn\-\-fiqs8s|xn\-\-fiqz9s|xn\-\-fpcrj9c3d|xn\-\-fzc2c9e2c|xn\-\-g6w251d|xn\-\-gecrj9c|xn\-\-h2brj9c|xn\-\-hgbk6aj7f53bba|xn\-\-hlcj6aya9esc7a|xn\-\-j6w193g|xn\-\-jxalpdlp|xn\-\-kgbechtv|xn\-\-kprw13d|xn\-\-kpry57d|xn\-\-lgbbat1ad8j|xn\-\-mgbaam7a8h|xn\-\-mgbayh7gpa|xn\-\-mgbbh1a71e|xn\-\-mgbc0a9azcg|xn\-\-mgberp4a5d4ar|xn\-\-o3cw4h|xn\-\-ogbpf8fl|xn\-\-p1ai|xn\-\-pgbs0dh|xn\-\-s9brj9c|xn\-\-wgbh1c|xn\-\-wgbl6a|xn\-\-xkc2al3hye2a|xn\-\-xkc2dl3a5ee0h|xn\-\-yfro4i67o|xn\-\-ygbi2ammx|xn\-\-zckzah|xxx)"         + "|y[et]"         + "|z[amw]))";      /**      * Good characters for Internationalized Resource Identifiers (IRI).      * This comprises most common used Unicode characters allowed in IRI      * as detailed in RFC 3987.      * Specifically, those two byte Unicode characters are not included.      */     public static final String GOOD_IRI_CHAR =         "a-zA-Z0-9u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF";      public static final Pattern IP_ADDRESS         = Pattern.compile(             "((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\.(25[0-5]|2[0-4]"             + "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]"             + "[0-9]{2}|[1-9][0-9]|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}"             + "|[1-9][0-9]|[0-9]))");      /**      * RFC 1035 Section 2.3.4 limits the labels to a maximum 63 octets.      */     private static final String IRI         = "[" + GOOD_IRI_CHAR + "]([" + GOOD_IRI_CHAR + "\-]{0,61}[" + GOOD_IRI_CHAR + "]){0,1}";      private static final String GOOD_GTLD_CHAR =         "a-zA-Zu00A0-uD7FFuF900-uFDCFuFDF0-uFFEF";     private static final String GTLD = "[" + GOOD_GTLD_CHAR + "]{2,63}";     private static final String HOST_NAME = "(" + IRI + "\.)+" + GTLD;      public static final Pattern DOMAIN_NAME         = Pattern.compile("(" + HOST_NAME + "|" + IP_ADDRESS + ")");      /**      *  Regular expression pattern to match most part of RFC 3987      *  Internationalized URLs, aka IRIs.  Commonly used Unicode characters are      *  added.      */     public static final Pattern WEB_URL = Pattern.compile(         "((?:(http|https|Http|Https|rtsp|Rtsp):\/\/(?:(?:[a-zA-Z0-9\$\-\_\.\+\!\*\'\(\)"         + "\,\;\?\&\=]|(?:\%[a-fA-F0-9]{2})){1,64}(?:\:(?:[a-zA-Z0-9\$\-\_"         + "\.\+\!\*\'\(\)\,\;\?\&\=]|(?:\%[a-fA-F0-9]{2})){1,25})?\@)?)?"         + "(?:" + DOMAIN_NAME + ")"         + "(?:\:\d{1,5})?)" // plus option port number         + "(\/(?:(?:[" + GOOD_IRI_CHAR + "\;\/\?\:\@\&\=\#\~"  // plus option query params         + "\-\.\+\!\*\'\(\)\,\_])|(?:\%[a-fA-F0-9]{2}))*)?"         + "(?:\b|$)"); // and finally, a word boundary or end of                         // input.  This is to stop foo.sure from                         // matching as foo.su      public static final Pattern EMAIL_ADDRESS         = Pattern.compile(             "[a-zA-Z0-9\+\.\_\%\-\+]{1,256}" +             "\@" +             "[a-zA-Z0-9][a-zA-Z0-9\-]{0,64}" +             "(" +                 "\." +                 "[a-zA-Z0-9][a-zA-Z0-9\-]{0,25}" +             ")+"         );      /**      * This pattern is intended for searching for things that look like they      * might be phone numbers in arbitrary text, not for validating whether      * something is in fact a phone number.  It will miss many things that      * are legitimate phone numbers.      *      * <p> The pattern matches the following:      * <ul>      * <li>Optionally, a + sign followed immediately by one or more digits. Spaces, dots, or dashes      * may follow.      * <li>Optionally, sets of digits in parentheses, separated by spaces, dots, or dashes.      * <li>A string starting and ending with a digit, containing digits, spaces, dots, and/or dashes.      * </ul>      */     public static final Pattern PHONE         = Pattern.compile(                      // sdd = space, dot, or dash                 "(\+[0-9]+[\- \.]*)?"        // +<digits><sdd>*                 + "(\([0-9]+\)[\- \.]*)?"   // (<digits>)<sdd>*                 + "([0-9][0-9\- \.]+[0-9])"); // <digit><digit|sdd>+<digit>      /**      *  Convenience method to take all of the non-null matching groups in a      *  regex Matcher and return them as a concatenated string.      *      *  @param matcher      The Matcher object from which grouped text will      *                      be extracted      *      *  @return             A String comprising all of the non-null matched      *                      groups concatenated together      */     public static final String concatGroups(Matcher matcher) {         StringBuilder b = new StringBuilder();         final int numGroups = matcher.groupCount();          for (int i = 1; i <= numGroups; i++) {             String s = matcher.group(i);              if (s != null) {                 b.append(s);             }         }          return b.toString();     }      /**      * Convenience method to return only the digits and plus signs      * in the matching string.      *      * @param matcher      The Matcher object from which digits and plus will      *                     be extracted      *      * @return             A String comprising all of the digits and plus in      *                     the match      */     public static final String digitsAndPlusOnly(Matcher matcher) {         StringBuilder buffer = new StringBuilder();         String matchingRegion = matcher.group();          for (int i = 0, size = matchingRegion.length(); i < size; i++) {             char character = matchingRegion.charAt(i);              if (character == '+' || Character.isDigit(character)) {                 buffer.append(character);             }         }         return buffer.toString();     }      /**      * Do not create this static utility class.      */     private Patterns() {} } 
</div
 
 
         
         
74
 
vote

попробую стандарт "Почему ты делаешь таким образом?" Ответ ... Вы знаете о <Код> NSLog(@"Response ==> %@" ,encodedString); UIWebView *webView; webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0, 320, 470)]; [webView setDelegate:self]; NSString *urlAddress = encodedString; NSURL *url1 = [NSURL URLWithString:urlAddress]; NSURLRequest *requestObj = [NSURLRequest requestWithURL:url1]; NSLog(@"url1 ==> %@" ,url1); [webView loadRequest:requestObj]; [[self view] addSubview:webView]; 3 ?

 <код> NSLog(@"Response ==> %@" ,encodedString);          UIWebView *webView;         webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0, 320, 470)];         [webView setDelegate:self];          NSString *urlAddress = encodedString;         NSURL *url1 = [NSURL URLWithString:urlAddress];         NSURLRequest *requestObj = [NSURLRequest requestWithURL:url1];         NSLog(@"url1 ==> %@" ,url1);         [webView loadRequest:requestObj];         [[self view] addSubview:webView]; 4  

Приведенное выше будет бросать <код> NSLog(@"Response ==> %@" ,encodedString); UIWebView *webView; webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0, 320, 470)]; [webView setDelegate:self]; NSString *urlAddress = encodedString; NSURL *url1 = [NSURL URLWithString:urlAddress]; NSURLRequest *requestObj = [NSURLRequest requestWithURL:url1]; NSLog(@"url1 ==> %@" ,url1); [webView loadRequest:requestObj]; [[self view] addSubview:webView]; 5 , если он не может разобрать URL.

 

I'll try a standard "Why are you doing it this way?" answer... Do you know about java.net.URL?

URL url = new URL(stringURL); 

The above will throw a MalformedURLException if it can't parse the URL.

</div
 
 
         
         
4
 
vote

Проблема со всеми рекомендуемыми подходами: все регулярные выражения VALVICE

Весь код установленного Regex перезаписан: он найдет только действительные URL! В качестве образца он будет игнорировать все, начиная с «http: //» и имея символы без ASCII внутри.

Еще больше: я столкнулся с 1-2 секунды обработки (однопоточный, выделенный) с пакетом Java Regex (фильтрующие адреса электронной почты из текста) для очень маленьких и простых предложений, ничего особенного; Возможно ошибка в Java 6 Regex ...

Прошедшее / самое быстрое решение было бы использовать StringTokerizer для разделения текста в токены, для удаления токенов, начиная с «http: //» и т. Д., а также для объединения токенов в текст снова.

Если вы хотите фильтровать электронные письма из текста (потому что позже вы будете делать сотрудники NLP и т. Д.) - Просто удалите все жетоны, содержащие «@» внутри.

Это простой текст, где переключается Regex java 6. Попробуйте в разных вариантах Java. Требуется около 1000 миллисекунднов на звонок REGEX, в длинном запуском однопоточное тестовое приложение:

 <код> NSLog(@"Response ==> %@" ,encodedString);          UIWebView *webView;         webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0, 320, 470)];         [webView setDelegate:self];          NSString *urlAddress = encodedString;         NSURL *url1 = [NSURL URLWithString:urlAddress];         NSURLRequest *requestObj = [NSURLRequest requestWithURL:url1];         NSLog(@"url1 ==> %@" ,url1);         [webView loadRequest:requestObj];         [[self view] addSubview:webView]; 6  

Не полагайтесь на регулярные выражения, если вам нужно только фильтровать слова с «@», «http: //», "ftp: //", "mailto:"; Это огромная инженерия накладных расходов.

Если вы действительно хотите использовать Regex с Java, попробуйте Automaton

 

The problem with all suggested approaches: all RegEx is validating

All RegEx -based code is over-engineered: it will find only valid URLs! As a sample, it will ignore anything starting with "http://" and having non-ASCII characters inside.

Even more: I have encountered 1-2-seconds processing times (single-threaded, dedicated) with Java RegEx package (filtering Email addresses from text) for very small and simple sentences, nothing specific; possibly bug in Java 6 RegEx...

Simplest/Fastest solution would be to use StringTokenizer to split text into tokens, to remove tokens starting with "http://" etc., and to concatenate tokens into text again.

If you want to filter Emails from text (because later on you will do NLP staff etc) - just remove all tokens containing "@" inside.

This is simple text where RegEx of Java 6 fails. Try it in divverent variants of Java. It takes about 1000 milliseconds per RegEx call, in a long running single threaded test application:

pattern = Pattern.compile("[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})", Pattern.CASE_INSENSITIVE);  "Avalanna is such a sweet little girl! It would b heartbreaking if cancer won. She's so precious! #BeliebersPrayForAvalanna"); "@AndySamuels31 Hahahahahahahahahhaha lol, you don't look like a girl hahahahhaahaha, you are... sexy."; 

Do not rely on regular expressions if you only need to filter words with "@", "http://", "ftp://", "mailto:"; it is huge engineering overhead.

If you really want to use RegEx with Java, try Automaton

</div
 
 
   
   
3
 
vote

Это тоже работает:

 <код> NSLog(@"Response ==> %@" ,encodedString);          UIWebView *webView;         webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0, 320, 470)];         [webView setDelegate:self];          NSString *urlAddress = encodedString;         NSURL *url1 = [NSURL URLWithString:urlAddress];         NSURLRequest *requestObj = [NSURLRequest requestWithURL:url1];         NSLog(@"url1 ==> %@" ,url1);         [webView loadRequest:requestObj];         [[self view] addSubview:webView]; 7  

Примечание:

 <код> NSLog(@"Response ==> %@" ,encodedString);          UIWebView *webView;         webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0, 320, 470)];         [webView setDelegate:self];          NSString *urlAddress = encodedString;         NSURL *url1 = [NSURL URLWithString:urlAddress];         NSURLRequest *requestObj = [NSURLRequest requestWithURL:url1];         NSLog(@"url1 ==> %@" ,url1);         [webView loadRequest:requestObj];         [[self view] addSubview:webView]; 8  

Так, вероятно, первый более полезный для общего использования.

 

This works too:

String regex = "\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"; 

Note:

String regex = "<\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]>"; // matches <http://google.com>  String regex = "<^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]>"; // does not match <http://google.com> 

So probably the first one is more useful for general use.

</div
 
 
3
 
vote

В соответствии с Billjamesdev Ответ, вот еще один подход для проверки URL без использования REGEX:

из Apache Commons Validator lib, посмотрите на класс Urlvalidator . Какой-то пример код:

Создайте Urlvalidator с действительными схемами «HTTP» и «HTTPS».

 <код> String[] schemes = {"http","https"}. UrlValidator urlValidator = new UrlValidator(schemes); if (urlValidator.isValid("ftp://foo.bar.com/")) {    System.out.println("url is valid"); } else {    System.out.println("url is invalid"); }  prints "url is invalid"   

Если вместо этого используется конструктор по умолчанию.

 <код> UrlValidator urlValidator = new UrlValidator(); if (urlValidator.isValid("ftp://foo.bar.com/")) {    System.out.println("url is valid"); } else {    System.out.println("url is invalid"); }   

Отпечатки out "URL действительны"

 

In line with billjamesdev answer, here is another approach to validate an URL without using a RegEx:

From Apache Commons Validator lib, look at class UrlValidator. Some example code:

Construct a UrlValidator with valid schemes of "http", and "https".

String[] schemes = {"http","https"}. UrlValidator urlValidator = new UrlValidator(schemes); if (urlValidator.isValid("ftp://foo.bar.com/")) {    System.out.println("url is valid"); } else {    System.out.println("url is invalid"); }  prints "url is invalid" 

If instead the default constructor is used.

UrlValidator urlValidator = new UrlValidator(); if (urlValidator.isValid("ftp://foo.bar.com/")) {    System.out.println("url is valid"); } else {    System.out.println("url is invalid"); } 

prints out "url is valid"

</div
 
 
1
 
vote
 <код> ((http?|https|ftp|file)://)?((W|w){3}.)?[a-zA-Z0-9]+.[a-zA-Z]+   

Узнайте здесь: - https://www.freeformatter.com /java-regex-tester.html#ad-output

Это сортирует тезисы записи правильно

    .
  • google.com
  • www.google.com
  • wwwgooglecom
  • ft.
  • www.google.com
  • .fft
  • https://www.google.com
  • https: //
  • https: // www .
  • https://google.com
 
((http?|https|ftp|file)://)?((W|w){3}.)?[a-zA-Z0-9]+.[a-zA-Z]+ 

check here:- https://www.freeformatter.com/java-regex-tester.html#ad-output

It sorts out theses entries correctly

  • google.com
  • www.google.com
  • wwwgooglecom
  • ft.
  • Www.google.com
  • .ft
  • https://www.google.com
  • https://
  • https://www.
  • https://google.com
</div
 
 
     
     
0
 
vote

При использовании регулярных выражений из библиотеки RegexBuddy, убедитесь, что в вашем собственном коде используйте одни и те же режимы сопоставления в собственном коде, что и регулярное выражение из библиотеки. Если вы генерируете фрагмент исходного кода на вкладке «Использовать», REGEXBUDDY автоматически установит правильные параметры совпадения в фрагменте исходного кода. Если вы копируете / вставьте Regex, вы должны сделать это самостоятельно.

В этом случае, как указали другие, вы пропустили вариант нечувствительности дела.

 

When using regular expressions from RegexBuddy's library, make sure to use the same matching modes in your own code as the regex from the library. If you generate a source code snippet on the Use tab, RegexBuddy will automatically set the correct matching options in the source code snippet. If you copy/paste the regex, you have to do that yourself.

In this case, as others pointed out, you missed the case insensitivity option.

</div
 
 

Связанный проблема

27  Отслеживание запроса XML / Ответы с JAX-WS при возникновении ошибки  ( Tracing xml request responses with jax ws when error occurs ) 
Я хочу войти в систему RAW Post Post, если есть какие-либо ошибки, я использую JAX-WS. Любая помощь будет оценена. Есть просто простым способом (ака: не исп...

60  Получение ConcurrentModificationException брошенного при удалении элемента из списка java.util.List во время итерации? [Дубликат]  ( Getting a concurrentmodificationexception thrown when removing an element from a ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

22  Множественные методы постконструкции?  ( Multiple postconstruct methods ) 
Он говорит в Документация Java для Postconstruct что Только один метод может быть аннотирован с этой аннотацией Но я просто пытался аннотировать три м...

0  Должен ли я использовать Mac для разработки Javafx для iOS  ( Do i have to use a mac to develop javafx for ios ) 
Документация http://docs.gluonhq.com/charm/4.0.1 / # _ iOS говорит, что мне нужно «Mac с MacOS X 10.9 или превосходящим» для разработки для iOS. Но я не пон...

1  Реализация интерфейса Realmmodel при расширении другого объекта  ( Implementing realmmodel interface while extending another object ) 
Я хочу использовать новую функцию realm-java, где я могу просто реализовать интерфейс Realmmodel и добавить аннотацию @realmclass для определения таблицы. Все...

17  Перегрузка Java VS переопределения  ( Java overloading vs overriding ) 
Привет, я просто хочу убедиться, что у меня есть эти понятия правильно. Перегрузка в Java означает, что у вас может быть конструктор или метод с различным кол...

-1  Нужно упростить логическое выражение (байт, короткое, целое число) Java  ( Need to simplify logical expression byte short integer java ) 
Мне нужно упростить выражение Первое выражение <код> (byte)( (short)((short)( (byte)((theInt >> 8) & 0xFF) & 0xFF) + 128) & 0xFF); второе выражение ...

21  Тип несоответствия для генеральных классов  ( Type mismatch for class generics ) 
У меня есть следующий код, который не скомпировался, и хотя есть способ сделать его компиляцией, я хочу понять, почему он не компилирует. Может ли кто-нибудь ...

3  Eclipse Java Formatter - новая линия до закрытия скобок  ( Eclipse java formatter newline before closing parentheses ) 
Можно ли настроить Dippleter Eclipse Java для вставки новой строки до закрытия скобок выражений, деклараций метода и вызовы методов? Обратите внимание на же...

0  Как удалить нынешние barchart (jfreechart), отображаемый и отображаю новый Barchart в том же представлении плагина Eclipse RCP?  ( How to delete the present barchartjfreechart displayed and display new barchar ) 
Я создаю Barchart с видом на плагин RCP. Данные, которые будут отображаться на графике, поставляется из файла базы данных SQLite3. Код, который я написал, ото...

3  Как мне изменить ответ на запрос на параметры http в приложении Spring MVC 2.5?  ( How do i change the response for a http options request in a spring mvc 2 5 appl ) 
Это звучит как тривиальный вопрос, но каким-то образом я не могу понять это. У меня есть приложение Spring MVC. Я не поддерживаю никаких HTTP-методов, кроме...

5  Конвенции о ведении регистрации [Закрыто]  ( Logging conventions ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

0  Класс libgdx не рисует текстуру  ( Libgdx class does not draw texture ) 
Я пытаюсь нарисовать игровой символ в моем классе "MaigaMestreen.java" из класса "Mavans.java", когда я касаюсь экрана моего телефона. К сожалению, моя прогр...

0  Android Studio Back Button  ( Android studio back button problems ) 
на данный момент. Я создал простое приложение для викторины на Android Studio. Все работает нормально, в том числе, когда я иду от первой фактической жизни. Я...

0  Как повторять первые столбцы, затем строки для чтения листа Excel в Java  ( How to iterate first columns then rows to read excel sheet in java ) 
Я хочу прочитать лист Excel так что я хочу прочитать мои данные 1-го столбца и повторять все строки, затем 2-й столбец Так как это сделать. Я сначала попроб...

Связанный проблема

27  Отслеживание запроса XML / Ответы с JAX-WS при возникновении ошибки 
60  Получение ConcurrentModificationException брошенного при удалении элемента из списка java.util.List во время итерации? [Дубликат] 
22  Множественные методы постконструкции? 
0  Должен ли я использовать Mac для разработки Javafx для iOS 
1  Реализация интерфейса Realmmodel при расширении другого объекта 
17  Перегрузка Java VS переопределения 
-1  Нужно упростить логическое выражение (байт, короткое, целое число) Java 
21  Тип несоответствия для генеральных классов 
3  Eclipse Java Formatter - новая линия до закрытия скобок 
0  Как удалить нынешние barchart (jfreechart), отображаемый и отображаю новый Barchart в том же представлении плагина Eclipse RCP? 
3  Как мне изменить ответ на запрос на параметры http в приложении Spring MVC 2.5? 
5  Конвенции о ведении регистрации [Закрыто] 
0  Класс libgdx не рисует текстуру 
0  Android Studio Back Button 
0  Как повторять первые столбцы, затем строки для чтения листа Excel в Java