Products
GG网络技术分享 2025-03-18 16:15 4
对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)是一类非常特殊的字符,它能够匹配一个位置或字符集合中的一个字符,元字符可以分为两种类型
元字符只能匹配一个字符位置,也就是一个匹配的单位是一个字符,而不是一个字符串
^a
a
的一行a$
a
的一行^a$
a
的一行\\bStr
Str
为开头的单词ing\\b
ing
为结尾的单词\\bString\\b
String
这个单词\\b
字符如何识别哪个是单词呢?
以标点符号或空格分隔的字符串将被识别为单词,而且 \\b
只能用于英文,不能用于中文
元字符都是按照单个字符进行匹配
.
\\w
\\W
\\s
\\S
\\d
\\D
仅仅是元字符就可以自由组合来实现不同的匹配效果
\\w\\w
\\w\\s
m
是和行末的换行符一起匹配成功的字符类是一个字符集合,如果该字符集合中的任何一个字符被匹配,则它会找到该匹配项。
[]
\\-
\\-
符号不是第一个字符的时候表示定义字符的范围*,例如[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\\.com
www\\.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.*b
a.?b
替换使用字符|
来表示,表示如果某一个字符串匹配了表达式中字符|
左边或者右边的规则,那么这个字符串就匹配了这个表达式|
表示“或”的意思,这个符号和代码中的“逻辑或”相同,比较好理解
匹配是根据左边优先的原则,即从左往右,当左边的表达式不满足的时候,才会去尝试右边的表达式
a|b
a
还是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
的后面紧跟着一个a
b(?!a)
b
,这个字符b
的后面不是a
(?<=a)b
b
,这个字符b
的前面是a
(?<!a)b
b
,这个字符b
的前面不是a
(?>a)b
Demand feedback