java正则表达式替换,Java编译器
本篇文章给大家谈谈java正则表达式替换,以及Java编译器对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
java中怎么替换string中的某个字符
/¥392931String这个对于程序原来说一定是最熟悉不过的,很多时候我们都习惯去使用String的原生方法去完成查找字符串、替换、删除,而正则表达式由于略显苦涩的语法常常被人忽略,其实很多时候使用正则表达式可以提高不少性能和节省资源。
一、正则表达式简述
正则表达式正则表达是Java中比较矛盾的知识点,因为使用起来可以很简单也可以相当地有难度,但是对于字符串操作来说应用得当则事半功倍,字符串查找,搜索,匹配,替换等等,正则表达式无所不能。而所谓正则表达式本质就是一个字符串(这个字符串按照一定的语法和规范被构造出来作为限定条件),其主要参与者——Pattern和Matcher:Pattern是Java正则表达式API中的主要入口,是程序语言中对这个特殊正则字符串的编译表示,需要使用正则表达式,第一步都是从构造Pattern类开始,而Matcher是输入字符串进行解释和匹配操作的引擎,通过解释 Pattern对 Character sequence执行匹配操作(即Matcher负责完成字符串的查找、匹配、替换等操作。)
二、正则表达式基本语法
1、预留字符
限定符
说明
.任意英文字母
\反斜杠,单独的反斜杠做为转义字符,与其他特殊字符一起使用。如果想匹配反斜杠本身,需要转义。两个反斜杠实际匹配一个反斜杠n字符的8进制表示.n在0至7之间取值
nn字符的8进制表示.n在0至7之间取值
mnn字符的8进制表示. m在0至3之间取值, n在0至7之间取值
\xhh字符的16进制表示.
\uhhhh字符的16进制表示 0xhhhh.对应unicode编码字符
\t缩进符.
换行符(unicode:‘\u000A’)
回车符(unicode:‘\u000D’)
\f制表符(unicode:‘\u000C’)
\a警报(铃声)字符(unicode:‘\u0007′)
\e转义符(unicode:‘\u001B’)
\cx控制符 x
\d匹配任意数字 [0-9]
\D匹配任意非数字 [^0-9]
\s匹配任意空白符(空格,缩进,换行,回车)
\S匹配任意非空白符
\w匹配任意单词
\W匹配任意非单词
2、设置指定限定条件[](即“[]”表示的是中括符里的内容是条件)
限定符
说明
[a-z]匹配小写a to z范围中任一个字符,又如[abc]匹配 a,或 b或 c
[A-Z]匹配大写A to Z范围中任一个字符
[a-zA-Z]匹配小写a to z或大写A to Z范围中一个字符
[0-9]匹配小写0 to 9范围中一个字符
[0-9a-z]匹配小写0 to 9或a to z范围中一个字符
[0-9[a-z]]匹配小写0 to 9或a to z范围中一个字符(交集)
[^abc]匹配不是a,b,c的字符,是否定匹配
[a-zA-Z]匹配a到 z,A到Z直接的字符,是范围匹配
[a-d[m-p]]匹配a到d之间字符或 m到p之间字符,是并集匹配
[a-z&&[def]]匹配 d, e,或 f.是交集匹配(这里是在范围 a-z和字符def之间取交集).
[a-z&&[^bc]]匹配a-z之间所有字符,排除bc的字符。是减法匹配
[a-z&&[^m-p]]匹配a-z之间所有字符,排除m-p之间的字符是减法匹配
3、边界匹配
边界符
说明
^匹配行首
$匹配行尾
\b匹配单词边界
\B匹配非单词边界
\A匹配文本开头
\G匹配前一匹配项结尾
\Z输入的结尾,仅用于最后的结束符(如果有的话)
\z匹配文本结尾
4、逻辑操作符和量词表示
正则表达式支持少量的逻辑运算(与,或)。与操作是默认的,表达式 cmo,意味着c与 m与o。
或操作需要显示指定,用|表示。例如表达式 crazy|mo意味着crazy或 mo。
贪婪模式
饥饿模式
独占模式
说明
X? X?? X?+匹配0或1次,即出现X 0或者1次
X* X**? X*+匹配0或多次
X+ X+? X++匹配1或多次
X{n} X{n}? X{n}+匹配n次
X{n,} X{n,}? X{n,}+匹配最少n次
X{n, m} X{n, m}? X{n, m}+匹配最少n次,最多m次
三、正则表达式的应用
编译正则表达式的字符串值构造对应的模式Pattern对象
创建匹配给定输入与此模式的匹配器Matcher
通过匹配器对象执行操作,匹配器对象的方法很丰富,互相组合使用更加强大(JDK在线API)
1、去掉字符串中的空格和换行符
public static String getNonBlankStr(String str){
if(str!=null&&!"".equals(str)){
Pattern pattern= Pattern.compile("\\s*|\t|
|
");//去掉空格符合换行符
Matcher matcher= pattern.matcher(str);
String result= matcher.replaceAll("");
return result;
}else{
return str;
}
} 12345678910
2、去掉指定特殊字符
public static String StringFilter(String str) throws PatternSyntaxException{// String regEx="[^a-zA-Z0-9]";//只允许字母和数字
//清除掉所有特殊字符(除了~之外)
String regEx="[`!@#$%^&*()+=|{}':;',//[//].<>/?!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
Pattern pattern= Pattern.compile(regEx);
Matcher matcher= pattern.matcher(str); return matcher.replaceAll("").trim();
}123456789
3、Pattern.matches()检查字符串中是否存在指定字符
String text="there are many hotels"+"by amap.the adrr: pattern.";String pattern=".*http://.*";
boolean matches= Pattern.matches(pattern, text);//true则存在123
4、Pattern.split()用正则表达式作为分隔符,把文本分割为String类型的数组
/**
*结果:element= grjk Text
element= wwwdsf
element= Many
element= egsdg r geg
*/String text="A reg grjk Text reg wwwdsf reg Many reg egsdg r geg";
String patternString="reg";
Pattern pattern= Pattern.compile(patternString);
String[] split= pattern.split(text);for(String element: split){
System.out.println("element="+ element);
}1234567891011121314
5、Matcher实例的find()+ start()+ end()寻找字符串中指定字符串出现的次数和起始和结束的索引位置
/**
*结果:found: 1: 2- 4
found: 2: 5- 7
found: 3: 23- 25
found: 4: 70- 72
*/String text="This is the text which is to be searched"+"for occurrences of the word'is'.";
String patternString="is";
Pattern pattern= Pattern.compile(patternString);
Matcher matcher= pattern.matcher(text);int count= 0;while(matcher.find()){
count++;
System.out.println("found:"+ count+":"+ matcher.start()+"-"+ matcher.end());
}12345678910111213141516
6、Matcher匹配指定格式的特殊字符串
Pattern pattern= Pattern.compile("[0-9]*");//判断是否都是数字
Matcher isNum= pattern.matcher("1123是数字");
if(isNum.matches()){
System.out.println("全部是数字");
} else{
System.out.println("有汉字");
}
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程序:
function IP2V(ip)
{
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g//匹配IP地址的正则表达式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("Not a valid IP address!")
}
}
不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:
var ip="10.100.20.168"
ip=ip.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 s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2)//结果为:abcefgi
我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法,最终没有找到,这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符,再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。这个方法对于字符顺序有要求的字符串可能不适用。
得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1
s=" "
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)
利用正则表达式限制网页表单里的文本框输入内容:
用正则表达式限制只能输入中文: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
“.*?” [ ]包含的字符串
strings surrounded by [ ]
\[[^\[]*?\]变量名
variable names
[a-zA-Z_][a-zA-Z_0-9]* IP地址
IP addresses
([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})网页地址
URL
(\S+)://([^:/]+)(:(\d+))?(/[^#\s]*)(#(\S+))?各行Tab以后的文字列
lines followed by a tab
\t.*$平仮名ひらがな
Hiragana
[\x{3041}-\x{309e}]全角片仮名全角カタカナ
Full-width Katakana
[\x{309b}-\x{309c}\x{30a1}-\x{30fe}]半角仮名半角カナ
Half-width Kana
[\x{ff61}-\x{ff9f}]中日韩汉字
CJK ideographs
[\x{3400}-\x{9fff}\x{f900}-\x{fa2d}]中日韩汉字符号
CJK ideograph marks
[\x{3000}-\x{3037}]韩国字符
Hangul
[\x{1100}-\x{11f9}\x{3131}-\x{318e}\x{ac00}-\x{d7a3}]行头插入//
Insert// at start of lines
Find: ^
Replace with://删除行头//
Remove// at end of lines
Find: ^//
Replace:删除行后的空白文字(包含空格和制表位 Space+Tab)
Remove trailing whitespaces
Find:\s+?$
Replace with:将(abc)替换为[abc]
Replace(abc) with [abc]
Find:\((.*?)\)
Replace:\[\1\]将<H3…>替换为<H4…>
Replace<H3…> with<H4…>
Find:<H3(.*?)>
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
Find: [a-z]
Replace:\U\0首字母大写
Capitalize all words
Find:([a-zA-Z])([a-zA-Z]*)
Replace:\U\1\L\2
关于java的正则表达
问题说得不清楚具体用什么技术实现啊,对比的要求是什么先贴个教程你可以先看下
正则表达式
"^\\d+$"//非负整数(正整数+ 0)
"^[0-9]*[1-9][0-9]*$"//正整数
"^((-\\d+)|(0+))$"//非正整数(负整数+ 0)
"^-[0-9]*[1-9][0-9]*$"//负整数
"^-?\\d+$"//整数
"^\\d+(\\.\\d+)?$"//非负浮点数(正浮点数+ 0)
"^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"//正浮点数
"^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$"//非正浮点数(负浮点数+ 0)
"^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"//负浮点数
"^(-?\\d+)(\\.\\d+)?$"//浮点数
"^[A-Za-z]+$"//由26个英文字母组成的字符串
"^[A-Z]+$"//由26个英文字母的大写组成的字符串
"^[a-z]+$"//由26个英文字母的小写组成的字符串
"^[A-Za-z0-9]+$"//由数字和26个英文字母组成的字符串
"^\\w+$"//由数字、26个英文字母或者下划线组成的字符串
"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"//email地址
"^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$"//url
"^[A-Za-z0-9_]*$"
正则表达式使用详解
简介
简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。其作用如下:
测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。
基本语法
在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。
正则表达式的形式一般如下:
/love/其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
较为常用的元字符包括:“+”,“*”,以及“?”。
“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次。
“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次。
“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。
下面,就让我们来看一下正则表达式元字符的具体应用。
/fo+/因为上述正则表达式中包含“+”元字符,表示可以与目标对象中的“fool”,“fo”,或者“football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。
/eg*/因为上述正则表达式中包含“*”元字符,表示可以与目标对象中的“easy”,“ego”,或者“egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。
/Wil?/因为上述正则表达式中包含“?”元字符,表示可以与目标对象中的“Win”,或者“Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。
有时候不知道要匹配多少字符。为了能适应这种不确定性,正则表达式支持限定符的概念。这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
{n} n是一个非负整数。匹配确定的 n次。例如,'o{2}'不能匹配"Bob"中的'o',但是能匹配"food"中的两个 o。
{n,} n是一个非负整数。至少匹配 n次。例如,'o{2,}'不能匹配"Bob"中的'o',但能匹配"foooood"中的所有 o。'o{1,}'等价于'o+'。'o{0,}'则等价于'o*'。
{n,m} m和 n均为非负整数,其中n<= m。最少匹配 n次且最多匹配 m次。例如,"o{1,3}"将匹配"fooooood"中的前三个 o。'o{0,1}'等价于'o?'。请注意在逗号和两个数之间不能有空格。
除了元字符之外,用户还可以精确指定模式在匹配对象中出现的频率。例如,/jim{2,6}/上述正则表达式规定字符m可以在匹配对象中连续出现2-6次,因此,上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。
在对如何使用正则表达式有了初步了解之后,我们来看一下其它几个重要的元字符的使用方式。
\s:用于匹配单个空格符,包括tab键和换行符;
\S:用于匹配除单个空格符之外的所有字符;
\d:用于匹配从0到9的数字;
\w:用于匹配字母,数字或下划线字符;
\W:用于匹配所有与\w不匹配的字符;
.:用于匹配除换行符之外的所有字符。
(说明:我们可以把\s和\S以及\w和\W看作互为逆运算)
下面,我们就通过实例看一下如何在正则表达式中使用上述元字符。
/\s+/上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。
/\d000/如果我们手中有一份复杂的财务报表,那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。
除了我们以上所介绍的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。定位符用于规定匹配模式在目标对象中的出现位置。较为常用的定位符包括:“^”,“$”,“\b”以及“\B”。
“^”定位符规定匹配模式必须出现在目标字符串的开头
“$”定位符规定匹配模式必须出现在目标对象的结尾
“\b”定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一
“\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。同样,我们也可以把“^”和“$”以及“\b”和“\B”看作是互为逆运算的两组定位符。举例来说:/^hell/因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以“hell”,“hello”或“hellhound”开头的字符串相匹配。/ar$/因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以“car”,“bar”或“ar”结尾的字符串相匹配。/\bbom/因为上述正则表达式模式以“\b”定位符开头,所以可以与目标对象中以“bomb”,或“bom”开头的字符串相匹配。/man\b/因为上述正则表达式模式以“\b”定位符结尾,所以可以与目标对象中以“human”,“woman”或“man”结尾的字符串相匹配。
为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如:
/[A-Z]/上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。
/[a-z]/上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。
/[0-9]/上述正则表达式将会与从0到9范围内任何一个数字相匹配。
/([a-z][A-Z][0-9])+/上述正则表达式将会与任何由字母和数字组成的字符串,如“aB0”等相匹配。这里需要提醒用户注意的一点就是可以在正则表达式中使用“()”把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如“abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。
如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符“|”。例如:/to|too|2/上述正则表达式将会与目标对象中的“to”,“too”,或“2”相匹配。
正则表达式中还有一个较为常用的运算符,即否定符“[^]”。与我们前文所介绍的定位符“^”不同,否定符“[^]”规定目标对象中不能存在模式中所规定的字符串。例如:/[^A-C]/上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。一般来说,当“^”出现在“[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。
最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“\”。例如:/Th\*/上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。
在构造正则表达式之后,就可以象数学表达式一样来求值,也就是说,可以从左至右并按照一个优先级顺序来求值。优先级如下:
1.\转义符
2.(),(?=), []圆括号和方括号
3.*,+,?,{n},{n,},{n,m}限定符
4.^,$,\anymetacharacter位置和顺序
5.|“或”操作
java正则表达式替换和Java编译器的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!