Products
GG网络技术分享 2025-03-18 16:15 47
对java的正则表达式对象不熟,特来请教。String s = \"23131http://baidu.com131http://qq.com1231http://taobao.com31231\"
现在想把字符串中的网址提取出来组成一个字符串数组,求代码,谢谢
因为你最后是要后去到的是网址 所以没有必要去用正则表达式 直接用字符串的截取查找就行 而且最后找到放到list里面去
下面写的一段看能不能满足你的要求
package cn.com.wangxiuwei.test;
import java.util.ArrayList;
import java.util.List;
public class TestStr {
/*** @param args
*/
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
String str=\\\"23131http://baidu.com131http://qq.com1231http://taobao.com31231\\\";
String strhttp=\\\"http\\\";
String strcom=\\\"com\\\";
int ihttp=0;
int icom=0;
for(int i=0;i<str.length();i++){
ihttp=str.indexOf(strhttp);
icom=str.indexOf(strcom);
if(ihttp<0||icom<0){
break;
}
list.add(str.substring(ihttp, icom+strcom.length()));
str=str.substring(icom+strcom.length());
System.out.println(str);
}
for(int i=0;i<list.size();i++){
System.out.println(list.get(i)+\\\"\\t第\\\"+(i+1)+\\\"网址\\\");
}
}
}
打印结果如下:
131http://qq.com1231http://taobao.com31231
1231http://taobao.com31231
31231
http://baidu.com 第1网址
http://qq.com 第2网址
http://taobao.com 第3网址
正则表达式(Regular Expression)
用某种模式去匹配一类字符串的公式,主要用来描述字符串匹配的工具。
匹配
文本或字符存在不止一个部分满足给定的正则表达式,这是每一个这样的部分都被称为一个匹配。
元字符(Metacharacter)是一类非常特殊的字符,它能够匹配一个位置或字符集合中的一个字符,元字符可以分为两种类型
元字符只能匹配一个字符位置,也就是一个匹配的单位是一个字符,而不是一个字符串
^aa的一行a$a的一行^a$a的一行\\bStrStr为开头的单词ing\\bing为结尾的单词\\bString\\bString这个单词\\b字符如何识别哪个是单词呢?
以标点符号或空格分隔的字符串将被识别为单词,而且 \\b只能用于英文,不能用于中文
元字符都是按照单个字符进行匹配
.\\w\\W\\s\\S\\d\\D仅仅是元字符就可以自由组合来实现不同的匹配效果
\\w\\w\\w\\sm是和行末的换行符一起匹配成功的字符类是一个字符集合,如果该字符集合中的任何一个字符被匹配,则它会找到该匹配项。
[]\\- \\-符号不是第一个字符的时候表示定义字符的范围*,例如[1-3]表示[123],[a-z]表示匹配任意小写字母,如果\\-放在第一位,那就仅表示自己,这个范围的顺序和两个字符间的内容是按照ASCII表的顺序决定的,例如[9-1]是违反ASCII表顺序的一个表达式,这会报错^[^123]表示匹配1、2、3之外的所有数字[aeiou][a-z]a到z之间的所有字母[^aeiou][^a-z]a到z之间的所有字母之外的所有字符[0-9]0到9之间的任意一个数字[ao-u]a和o到u之间的所有字母,可以看到只要在连个字符之间使用连接符-就会判断为一个区间[!-?]!到?之间的任意一个符号,可以看到因为是按照ASCII表顺序来判断-连接的字符集合,所以这样写也是没有问题的[a^-]a、^和-三个字符,只要^符号不在第一位,-符号不在两个字符中间,那么它们就只表示自身a[no]an或ao,这是字符类和元字符的组合之前介绍的元字符非常好用,但是这又引出了一个问题,如果我们想在正常的表达式里面使用元字符本身这个符号怎么办呢?难道每次都要写在字符类里面吗?
当然不,这里就引出了我们的字符转义
正则表达式定义了一些特殊的元字符,如^、$、.等。由于这些字符在正则表达式中被解释成其他指定的含义,如果需要匹配这些字符,则需要使用字符转义来解决这个问题。转义字符使用符号\\(反斜杠),它可以取消这些字符(如^、$、.等)在表达式中具有的特殊意义。
..** \\\\www\\.lanyuanxiaoyao\\.comwww\\.lanyuanxiaoyao\\.com,网址中的dot符号也是需要转义的这是一个重要的知识点
限定符用于指定允许特定字符或字符集自身重复出现的次数。
a{3}a{2,}a{2,3}ab+ab?ab*ab+?ab??ab*?如果在限定符*、+、?、{n}、{n,}和{n,m}之后再添加一个字符 ? ,则表示 尽可能少地重复字符?之前的限定符号的重复次数,这种匹配方式称为懒惰匹配,与之相对的,如果没有字符 ? ,仅仅使用单个限定符*、+、?、{n}、{n,}和{n,m}的匹配,就称为贪婪匹配。
a.*ba.?b替换使用字符|来表示,表示如果某一个字符串匹配了表达式中字符|左边或者右边的规则,那么这个字符串就匹配了这个表达式|表示“或”的意思,这个符号和代码中的“逻辑或”相同,比较好理解
匹配是根据左边优先的原则,即从左往右,当左边的表达式不满足的时候,才会去尝试右边的表达式
a|ba还是b都可以匹配这个表达式,它等同于[ab]分组又被称为子表达式,即把一个正则表达式的全部或部分分成一个或多个组,分组使用()来表示,括号中的表达式就是一个组,一个组就是一个整体
要注意和字符类[]区分开来,[123]是表示匹配字符1或2或3,而(123)就是匹配123这个字符串
组号
当一个正则表达式被分组之后,默认从左到右每一个分组都会自动被赋予一个组号,以左括号(为分界从1开始自增,第一个组的组号是1,第二个组的组号是2,以此类推,在后面的表达式,使用\\组号的方式来引用前面的组,例如\\b(\\w)\\1\\b这个表达式中,后面的\\1就是对前面(\\w)组的引用
自定义组号
分组不止会自动使用数字作为组号,还可以手动命名,形式为(?<name>),(?<word>\\w)和(?'word'\\w)都是把\\w+匹配到的字母保存到名为word的分组,自定义命名的分组使用\\k<name>的方式使用 ,如\\b(?<word>\\w)\\k<word>\\b是匹配连续的相同的两个字母的单词
\\b(\\w)\\1\\b 这个表达式中的\\1表示的是前面\\w匹配到的字符,前面匹配到字母a那么\\1处也必须替换为字母a,而不是任意一个字母 所以这个表达式匹配的是两个完全相同的字母 而如果是\\b(\\w)\\w\\b 则是表示两个允许不相同的字母 (ab)ab就是一个整体看待,和单独的字符串ab没有区别(?<word>ab)\\k<word>ab这个组命名为word,然后在后面调用前面命名的这个组匹配的字符,即这个表达式相当于(ab)ab(?:a)(b)\\1(b)开始,所以后面的\\1匹配的是(b)b(?=a)b,这个字符b的后面紧跟着一个ab(?!a)b,这个字符b的后面不是a(?<=a)bb,这个字符b的前面是a(?<!a)bb,这个字符b的前面不是a(?>a)bDemand feedback