JS:
支持正则表达式的 String 对象的方法主要有:
Search,检索与正则表达式相匹配的值,返回的是第一个与 regexp 相匹配的子串的起始位置,如果没有找到的话 则返回-1 。
match,找到一个或多个正则表达式的匹配,返回的是一个指定的值,而不是字符串的位置。
replace,替换与正则表达式匹配的子串,返回的是一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。
split,把字符串分割为字符串数组,返回的是一个字符串数组,但是不包括字符串自己本身。
也可以直接实例化获得一个正则对象来使用:
new RegExp(pattern, attributes);
匹配字符串str中的数字:str.match(/[0-9]+/));//匹配至少一位0~9之间的数字
/^1[3456789]\d{9}$/
对于这个字符串来说,前面的^1表示的是以1开头的任何字符串,[3456789]则是3~9中的任意数,d{9}则是查找9个数字,可以用来匹配查找是否为手机号码。
接下来随便举个例子,说说邮箱地址的格式
通常情况下,邮箱@前缀的有以下几种类型:
1、纯数字 123456@qq.com
2、纯字母 zhangsan@qq.com
3、字母数字混合 zhang123@qq.com
4、带点的 zhang.san@qq.com
5、带下划线 zhang_san@qq.com
6、带连接线 zhang-san@qq.com
至少有两处单词
顶级域名一般为2~4位(如cn、com、club)
默认前缀、后缀不以’’、’-’、’.'结尾,所以正则可以写成:
^ [A-Za-z0-9]+([-.][A-Za-z\d]+)@([a-zA-Z0-9]+[-.])+[A-Za-z\d]{2,4}$ ,
^ [A-Za-z0-9] 这一部分说的就是查找以字母数字开头的字符串,[-_.]而这个则是匹配下划线连接线点的,@([a-zA-Z0-9]+[-.])则是匹配@加上之后的qq.com、163.com之类的,最后这里[A-Za-z\d]{2,4} ,则是2~4位的由字母组成的域名。
创建方式:
var reg = /pattern/flags
// 字面量创建方式
var reg = new RegExp(pattern,flags);
//实例创建方式
主要有以下三个标识:
i 忽略大小写匹配
m 多行匹配,即在到达一行文本末尾时还会继续寻常下一行中是否与正则匹配的项
g 全局匹配 模式应用于所有字符串,而非在找到第一个匹配项时停止i 忽略大小写匹配
主要的方法:
reg.test(str) 用来验证字符串是否符合正则 符合返回true 否则返回false
reg.exec() 用来捕获符合规则的字符串,值得注意的是,当我们用exec进行捕获时,如果正则没有加’g’标识符,则exec捕获的每次都是同一个,当正则中有’g’标识符时,捕获的结果就不一样了,
str.match(reg) 如果匹配成功,就返回匹配成功的数组,如果匹配不成功,就返回null
**str.replace(reg,newStr);**使用正则去匹配字符串,匹配成功的字符串替换成新的字符串。
正则的特性:
贪婪性:所谓的贪婪性就是正则在捕获时,每一次会尽可能多的去捕获符合条件的内容。
如果我们想尽可能的少的去捕获符合条件的字符串的话,可以在量词元字符后加?
懒惰性:懒惰性则是正则在成功捕获一次后不管后边的字符串有没有符合条件的都不再捕获。
如果想捕获目标中所有符合条件的字符串的话,我们可以用标识符g来标明是全局捕获
思维导图:
零宽断言
用于查找在某些内容(但并不包括这些内容)之前或之后的东西,如\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。
在使用正则表达式时,捕获的内容前后必须是特定的内容,而我们又不想捕获这些特定内容的时候,零宽断言就可以派上用场了。
零宽度正预测先行断言 (?=exp),字符出现的位置的的右边必须匹配到exp这个表达式
零宽度负预测先行断言 (?!exp),字符出现的位置的的右边不能是exp这个表达式
零宽度正回顾后发断言 (?<=exp),字符出现的位置的前边是exp这个表达式。
零宽度负回顾后发断言 (?<!exp),字符出现的位置的前边不是exp这个表达式。
JAVA:
java.util.regex 包主要包括以下三个类:
Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接收一个正则表达式作为它的第一个参数。
Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
对java的解释器来说,在反斜线字符(/)前的字符有特殊的含义。在java中,与regex有关的包,并不是都能理解和识别反斜线字符(/),为了让反斜线字符(/)在模式对象中被完全地传递,应该用双反斜线字符(/)。此外圆括号在正则表达中两层含义,如果想让它解释为字面上意思(即圆括号),也需要在它前面用双反斜线字符(/)。Java与JS在正则表达式上的一些区别则是java中需要转义字符\d ,而js中直接用\d。
下面的一段代码实现的功能是,从一个文本文件逐行读入,并逐行搜索电话号码数字,一旦找到所匹配的,然后输出在控制台。
BufferedReader br = new BufferedReader(“file”) ;
Pattern pattern = Pattern.compile("//(//d{3}//)//s//d{8}");//将表示正则表达式的字符串编译成Pattern对象
Scanner input = new Scanner(System.in);
String tele = input.nextLine();
while ((tele = br.readLine()) != null)
{
Matcher matcher = pattern.matcher(tele);//传入一个字符串从而获取一个Matcher的对象
if (matcher.find())//尝试查找与模式匹配的输入序列的下一个子序列。
{
System.out.println(matcher.group());//输出上一个匹配项匹配的输入子序列。
}
}
br.close();
Java的正则表达式是由java.util.regex的Pattern和Matcher类实现的。Pattern对象表示经编译的正则表达式。静态的compile( )方法负责将表示正则表达式的字符串编译成Pattern对象。正如上面所写的,只要给Pattern的matcher( )方法送一个字符串就能获取一个Matcher对象。
Matcher.find( )的功能是发现字符序列里的,与pattern相匹配的多个字符序列。就像一个迭代器,从头到尾扫描一遍字符串。
Matcher.group()是指里用括号括起来的,能被后面的表达式调用的正则表达式。Group 0 表示整个表达式,group 1表示第一个被括起来的group,例:(123(23(4)5)6)
Group(0)是12323456 ,Group(1)是2345 ,Group2是4 。
split( ),分割是指将以正则表达式为界,将字符串分割成String数组。
而正则表达式更多的是用在替换的操作上,例如:
replaceFirst(String replacement)将字符串里,第一个与模式相匹配的子串替换成replacement。
replaceAll(String replacement),将输入字符串里所有与模式相匹配的子串全部替换成replacement。
appendReplacement(StringBuffer sbuf, String replacement)对sbuf进行逐次替换,而不是像replaceFirst( )或replaceAll( )那样,只替换第一个或全部子串。这是个非常重要的方法,因为它可以调用方法来生成replacement(replaceFirst( )和replaceAll( )只允许用固定的字符串来充当replacement)。有了这个方法,你就可以编程区分group,从而实现更强大的替换功能。
调用完appendReplacement( )之后,为了把剩余的字符串拷贝回去,必须调用appendTail(StringBuffer sbuf, String replacement)。
在正则表达式中:
句点符号“.” :匹配所有字符 ,譬如当你想查找一个“1.t”时,可以查找到1,t 1-t 甚至是1空格t
方括号符号[]: 则是用来避免匹配的字符过多的问题,在里面指定自己需要的字符即可
除此之外还有或“|”符号以及否符号“^”,而假设当你在搜索时希望某个字符可以出现也可以不出现时,可以在该字符之后加个? .