layout: post
title: 正则表达式总结regex
tags:
- regex
categories: - notes
description: 正则表达式是用于进行文本匹配的工具 [\u4e00-\u9fa5] 匹配中文汉字
---
总结正则表达式
http://deerchao.net/tutorials/regex/regex-1.htm 这是我学习的网站
正则表达式是用于进行文本匹配的工具
[\u4e00-\u9fa5] 匹配中文汉字
\d+ 一位或多位数字
\b 代表单词开头或者结尾
. 除了换行符意外的任意字符
* 指前面的内容可以重复零次或者任意次
\d 一位数字
\d{8} 必须连续重复8次的数字
\s 任意的空白符 包括空格 制表符(tab) 换行符
\w 代表字母或者数字 或_ 下划线
+ 指前面的内容可以重复一次或任意次
\d{5,12} 数字必须重复五次(最少) 最多12次
^ 匹配字符串的开始
$ 匹配字符串的结束
转义字符(java中转义字符本身也需要\转义)
? 重复零次或者一次
{n,} 重复n次或更多次
[] 匹配中括号中的一个符号(特殊代码不会被解释成特殊含义,不用转义)
[0-9] \d
[a-z0-9A-Z] \w
反义 (字母大写)
\W 匹配任意不是字母和数字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或者结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou以外的任意字符
重复
* + ? {n} {n,} {n,m}
| 满足其中一种任意规则都应匹配A+B|B+C 如果满足A+B匹配正确 否则匹配是否满足B+C 大范围应该在左侧先匹配 比如 美国5位或9位邮编 \d{5}|\d{5}-\d{4} 那么只会匹配5位的邮编(以及9位邮编的前5位)
(exp) 匹配exp,并捕获文本到自动命名的组里 如 \1, \2...
(?<name>exp) 匹配exp,并捕获文本内容到名称为name的组里如 \k<name>
断言 断言assert 预计expected 实际actual
零宽断言 匹配某个位置,但匹配内容不包括自身 如\b ^ $ 都是匹配某个位置 \b匹配单词的开头或结尾 但匹配出的内容并不包括开头或者结尾 只匹配\b内容\b的位置
(?=exp) 零宽先行断言 匹配文本中的位置 这些位置的后面能匹配给定的exp后缀 但匹配内容不包括后缀
(?<=exp) 零宽后行断言 匹配文本中的位置 这些位置的前面能匹配给定的exp前缀 但匹配内容不包括前缀
负向位至指定 他只会匹配一个满足负向位置指定的内容,但不会消费任何字符
什么叫不会消费任何字符?
例如 \b\w*q[^u]\w*\b 这个会匹配后面不是u 但前面是q的单词 如 aqa aqc 但是也会匹配lraq fighting 这样 lraq,ben 等内容 因为[^u]做为匹配条件参与了匹配 并且消费了一个字符 上例修改为 \b\w*q[?!u]\w*\b 这样就能满足需求 (?!u)是不消费字符的,任然会将 \b\w*q\w*\b 作为一个整体匹配 然后在判断q(?!u) q后面是否为u 断言都是不消费任何字符的
零宽负向先行断言 (?!exp) 他只会匹配后缀exp不存在的位置 \d{3}(?!\d)匹配三位数字且第四位不能是数字
零宽负向后行断言 (?<!exp) 只会匹配前缀exp不存在的位置(?<!\d)\d{3}匹配三位数字且不能是数字开头
贪婪匹配
贪婪匹配 当正则表达式中包含能接受重复的量词 他将会匹配尽可能多的字符 如 a*b来搜索aabab 将会匹配到字符串aabab 这成为贪婪匹配
懒惰匹配 匹配尽可能少的字符 在重复标记后面加上?号来实现匹配任意数量的重复 但是再能使整个匹配成功的前提下使用最少的重复 例如 将a*b改为 a,*?b 来搜索aabad将匹配aab和ab
*? 重复任意次 但尽可能少的重复
+? 重复一次或者更多次 但尽可能少的重复
?? 重复0次或1次 但尽可能少的重复
{n,m}? 重复n到m次 但尽可能少的重复
{n,}? 重复n次以上 但尽可能少的重复
html5表单中使用正则表达式
<input type="tel" required="required" pattern="^1([3-5]|[7-8])\d{9}$" oninvalid="setCustomValidity('不是电话号码')" oninput="setCustomValidity('')"/>
<!-- oninvalid:提交的input元素的值为无效值时(这里是正则验证失败),触发oninvalid事件。oninvalid属于Form 事件。setCustomValidity() 这个是HTML5内置的JS方法,用来自定义提示信息 -->
<!-- 这样必须页面submit才有效 如果用在js异步上可以监听提交事件-->
<script type="text/javascript">
jQuery("#registerForm").on("submit",function (event) {
event.preventDefault();//取消提交
jQuery.post({
url:"UserServlet",
data:$("#registerForm").serialize(),
success:function (resulet) {
if (resulet=='true') {
location.href="register_ok.html";
}else{
jQuery("#msg").text(resulet);
}
},
error:function () {
alert("服务器忙...");
}
});
});
</script>
java中使用正则表达式
String a = "123a456a789";//第一种
String regular = "\\d{3}";
boolean t = Pattern.matches(regular,a);
Pattern pattern =Pattern.compile(regular);//第二种
Matcher matcher = pattern.matcher(a);
boolean t1 = matcher.matches();
js种使用正则表达式
var a = new RegExp("^[a-zA-Z]+$");
var booleanvaluse = a.test("a");
var reg = /^[a-zA-Z]\w{5,17}$/;
var booleanvalusereg2.test(username);