JAVA正则表达式
发布时间:2025-05-21 21:45:12 发布人:远客网络
一、JAVA正则表达式
这是我的blog上面的详细介绍。配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*)\/>/
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:
String.prototype.trim= function()
return this.replace(/(^\s*)|(\s*$)/g,"");
利用正则表达式分解和转换IP地址:
下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g//匹配IP地址的正则表达式
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
throw new Error("Not a valid IP address!")
不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?
利用正则表达式去除字串中重复的字符的算法程序:[注:此程序不正确,原因见本贴回复]
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法,最终没有找到,这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符,再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。这个方法对于字符顺序有要求的字符串可能不适用。
得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1
s=" "
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
利用正则表达式限制网页表单里的文本框输入内容:
用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"
用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"
用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^\d]/g,'')"onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,'')"onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"出处:蓝色理想
前一段时间写了2段EmEditor的宏,用来统计代码行数和简单的规约检查,稍微整理一下,
下面是从EmEditor的Q&A的提取的实例:双引号包含的字符串
strings surrounded by double-quotation marks
([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})网页地址
(\S+)://([^:/]+)(:(\d+))?(/[^#\s]*)(#(\S+))?各行Tab以后的文字列
[\x{3041}-\x{309e}]全角片仮名全角カタカナ
[\x{309b}-\x{309c}\x{30a1}-\x{30fe}]半角仮名半角カナ
[\x{ff61}-\x{ff9f}]中日韩汉字
[\x{3400}-\x{9fff}\x{f900}-\x{fa2d}]中日韩汉字符号
[\x{3000}-\x{3037}]韩国字符
[\x{1100}-\x{11f9}\x{3131}-\x{318e}\x{ac00}-\x{d7a3}]行头插入//
Replace:删除行后的空白文字(包含空格和制表位 Space+Tab)
Replace with:将(abc)替换为[abc]
Replace:\[\1\]将<H3…>替换为<H4…>
Replace<H3…> with<H4…>
Replace:<H4\1>将9/13/2003替换为2003年9月13日
Replace 9/13/2003 with 2003.9.13
Find:([0-9]{1,2})/([0-9]{1,2})/([0-9]{2,4})
Replace:\3年\1月\2日将字母a-z替换为大写字母
Uppercase characters from a to z
Replace:\U\0首字母大写
Replace:\U\1\L\2
二、关于java的正则表达
1、问题说得不清楚具体用什么技术实现啊,对比的要求是什么先贴个教程你可以先看下
2、"^\\d+$"//非负整数(正整数+ 0)
3、"^((-\\d+)|(0+))$"//非正整数(负整数+ 0)
4、"^-[0-9]*[1-9][0-9]*$"//负整数
5、"^\\d+(\\.\\d+)?$"//非负浮点数(正浮点数+ 0)
6、"^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"//正浮点数
7、"^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$"//非正浮点数(负浮点数+ 0)
8、"^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"//负浮点数
9、"^(-?\\d+)(\\.\\d+)?$"//浮点数
10、"^[A-Za-z]+$"//由26个英文字母组成的字符串
11、"^[A-Z]+$"//由26个英文字母的大写组成的字符串
12、"^[a-z]+$"//由26个英文字母的小写组成的字符串
13、"^[A-Za-z0-9]+$"//由数字和26个英文字母组成的字符串
14、"^\\w+$"//由数字、26个英文字母或者下划线组成的字符串
15、"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"//email地址
16、"^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$"//url
17、简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。其作用如下:
18、测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
19、替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
20、根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。
21、在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。
22、/love/其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
23、较为常用的元字符包括:“+”,“*”,以及“?”。
24、“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次。
25、“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次。
26、“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。
27、下面,就让我们来看一下正则表达式元字符的具体应用。
28、/fo+/因为上述正则表达式中包含“+”元字符,表示可以与目标对象中的“fool”,“fo”,或者“football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。
29、/eg*/因为上述正则表达式中包含“*”元字符,表示可以与目标对象中的“easy”,“ego”,或者“egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。
30、/Wil?/因为上述正则表达式中包含“?”元字符,表示可以与目标对象中的“Win”,或者“Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。
31、有时候不知道要匹配多少字符。为了能适应这种不确定性,正则表达式支持限定符的概念。这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
32、{n} n是一个非负整数。匹配确定的 n次。例如,'o{2}'不能匹配"Bob"中的'o',但是能匹配"food"中的两个 o。
33、{n,} n是一个非负整数。至少匹配 n次。例如,'o{2,}'不能匹配"Bob"中的'o',但能匹配"foooood"中的所有 o。'o{1,}'等价于'o+'。'o{0,}'则等价于'o*'。
34、{n,m} m和 n均为非负整数,其中n<= m。最少匹配 n次且最多匹配 m次。例如,"o{1,3}"将匹配"fooooood"中的前三个 o。'o{0,1}'等价于'o?'。请注意在逗号和两个数之间不能有空格。
35、除了元字符之外,用户还可以精确指定模式在匹配对象中出现的频率。例如,/jim{2,6}/上述正则表达式规定字符m可以在匹配对象中连续出现2-6次,因此,上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。
36、在对如何使用正则表达式有了初步了解之后,我们来看一下其它几个重要的元字符的使用方式。
37、\s:用于匹配单个空格符,包括tab键和换行符;
38、\S:用于匹配除单个空格符之外的所有字符;
39、\d:用于匹配从0到9的数字;
40、\w:用于匹配字母,数字或下划线字符;
41、\W:用于匹配所有与\w不匹配的字符;
42、.:用于匹配除换行符之外的所有字符。
43、(说明:我们可以把\s和\S以及\w和\W看作互为逆运算)
44、下面,我们就通过实例看一下如何在正则表达式中使用上述元字符。
45、/\s+/上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。
46、/\d000/如果我们手中有一份复杂的财务报表,那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。
47、除了我们以上所介绍的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。定位符用于规定匹配模式在目标对象中的出现位置。较为常用的定位符包括:“^”,“$”,“\b”以及“\B”。
48、“^”定位符规定匹配模式必须出现在目标字符串的开头
49、“$”定位符规定匹配模式必须出现在目标对象的结尾
50、“\b”定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一
51、“\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。同样,我们也可以把“^”和“$”以及“\b”和“\B”看作是互为逆运算的两组定位符。举例来说:/^hell/因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以“hell”,“hello”或“hellhound”开头的字符串相匹配。/ar$/因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以“car”,“bar”或“ar”结尾的字符串相匹配。/\bbom/因为上述正则表达式模式以“\b”定位符开头,所以可以与目标对象中以“bomb”,或“bom”开头的字符串相匹配。/man\b/因为上述正则表达式模式以“\b”定位符结尾,所以可以与目标对象中以“human”,“woman”或“man”结尾的字符串相匹配。
52、为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如:
53、/[A-Z]/上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。
54、/[a-z]/上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。
55、/[0-9]/上述正则表达式将会与从0到9范围内任何一个数字相匹配。
56、/([a-z][A-Z][0-9])+/上述正则表达式将会与任何由字母和数字组成的字符串,如“aB0”等相匹配。这里需要提醒用户注意的一点就是可以在正则表达式中使用“()”把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如“abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。
57、如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符“|”。例如:/to|too|2/上述正则表达式将会与目标对象中的“to”,“too”,或“2”相匹配。
58、正则表达式中还有一个较为常用的运算符,即否定符“[^]”。与我们前文所介绍的定位符“^”不同,否定符“[^]”规定目标对象中不能存在模式中所规定的字符串。例如:/[^A-C]/上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。一般来说,当“^”出现在“[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。
59、最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“\”。例如:/Th\*/上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。
60、在构造正则表达式之后,就可以象数学表达式一样来求值,也就是说,可以从左至右并按照一个优先级顺序来求值。优先级如下:
61、4.^,$,\anymetacharacter位置和顺序
三、java爬虫读取某一张指定图片的url,求解答
package pers.baijiaming.download.main;import java.io.*;//io包import java.util.regex.*;//正则包import java.net.*;//网络包/**下载图片类**/public final class DownloadPictures implements Runnable{
private URL url= null;//URL private URLConnection urlConn= null;//url连接 private BufferedReader bufIn= null;//缓冲读取器,读取网页信息
private static final String IMG_REG="<img.*src\\s*=\\s*(.*?)[^>]*?>";//img标签正则 private static final String IMG_SRC_REG="src\\s*=\\s*\"?(.*?)(\"|>|\\s+)";//img src属性正则
private String downloadPath= null;//保存路径
//构造,参数:想要下载图片的网址、下载到的图片存放的文件路径 public DownloadPictures(String urlStr, String downloadPath)
createFolder(downloadPath);//创建文件夹
urlConn= url.openConnection();
//设置请求属性,有部分网站不加这句话会抛出IOException: Server returned HTTP response code: 403 for URL异常//如:b站 urlConn.setRequestProperty("User-Agent","Mozilla/4.0(compatible; MSIE 5.0; Windows NT; DigExt)");
bufIn= new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
this.downloadPath= downloadPath;
//检测路径是否存在,不存在则创建 private void createFolder(String path)
if(!myPath.exists())//不存在则创建文件夹 myPath.mkdirs();
//下载函数 public void Download()
final int N= 20;//每一次处理的文本行数,这个数越小越容易遗漏图片链接,越大效率越低(理论上)
while(line!= null)//网页内容被读完时结束循环{
for(int i= 0; i< N; i++)//读取N行网页信息存入到text当中,因为src内容可能分为多行,所以使用这种方法 try{
line= bufIn.readLine();//从网页信息中获取一行文本
if(line!= null)//判断防止把null也累加到text中 text+= line;
//将img标签正则封装对象再调用matcher方法获取一个Matcher对象 final Matcher imgM= Pattern.compile(IMG_REG).matcher(text);
if(!imgM.find())//如果在当前text中没有找到img标签则结束本次循环 continue;
//将img src正则封装对象再调用matcher方法获取一个Matcher对象//用于匹配的文本为找到的整个img标签 final Matcher imgSrcM= Pattern.compile(IMG_SRC_REG).matcher(imgM.group());
while(imgSrcM.find())//从img标签中查找src内容{
String imageLink= imgSrcM.group(1);//从正则中的第一个组中得到图片链接
print(imageLink);//打印一遍链接
//如果得到的src内容没有写协议,则添加上// if(!imageLink.matches("https://[\\s\\S]*"))//这里有问题// imageLink="https://"+ imageLink;
print(imageLink);//打印一遍链接
//缓冲输入流对象,用于读取图片链接的图片数据//在链接的图片不存在时会抛出未找到文件异常 final BufferedInputStream in= new BufferedInputStream(new URL(imageLink).openStream());
//文件输出流对象用于将从url中读取到的图片数据写入到本地//保存的路径为downloadPath,保存的图片名为时间戳+".png" final FileOutputStream file= new FileOutputStream(new File(downloadPath+ System.currentTimeMillis()+".png"));
int temp;//用于保存in从图片连接中获取到的数据 while((temp= in.read())!=-1)
file.write(temp);//将数据写入到本地路径中
//下载完一张图片后休息一会 try{
catch(InterruptedException e){
//打印语句 public void print(Object obj)