-
1、Java正则表达式
B | 指定字符B |
\xhh | 十六进制值为oxhh等等字符 |
\uhhhh | 十六进制表示为oxhhhh的Unicode字符 |
\t | 制表符Tab |
\n | 换行符 |
\r | 回车 |
\f | 转页 |
\e | 转义(Escape) |
. | 任意字符 |
[abc] | 包含a、b和c的任何字符(和a|b|c作用相同) |
[^abc] | 除了a、b和c之外的任何字符(否定) |
[a-zA-Z] | 从a到z或从A到Z的任何字符(范围) |
[abc[hij]] | 任意a、b、c、h、i和j字符(合并)并集 |
[a-z&&[hij]] | 任意h、i或j(交集) |
\s | 空白符(空格、tab、换行、换页和回车) |
\S | 非空白符 |
\d | 数字[0-9] |
\D | 非数字[^0-9] |
\w | 词字符[a-zA-Z0-9] |
\W | 非词字符[^\w] |
XY | Y跟在X后面 |
X|Y | X或Y |
(X) | 捕获组(capturing group) |
^ | 一行的开始 |
$ | 一行的结束 |
\b | 词的边界 |
\B | 非词的边界 |
\G | 前一个匹配的结束 |
贪婪型 | 勉强型 | 占有型 | 如何匹配 |
X? | X?? | X?+ | 一个或零个X |
X* | X*? | X*+ | 零个或多个X |
X+ | X+? | X++ | 一个或多个X |
X{n} | X{n}? | x{n}+ | 恰好n次X |
X{n,} | x{n,}? | x{n,}+ | 至少n次X |
X{n,m} | X{n,m}? | X{n,m}+ | X至少n次,且不能超过m次 |
编译标记 | 效果 |
Pattern.CANON_EQ | 两个字符当且仅当他们的完全规范分解相匹配时,就认为他们是相匹配的。 |
Pattern.CASE_INSENSITIVE(?i) | 不考虑大小写 |
Pattern.COMMENTS(?x) | 在这种模式下,空格符被忽略掉,并且一#开始的注释也会被忽略掉 |
Pattern.DOTALL(?s) | 在dotall下表达式"."匹配所有字符,包括行终结符,默认是不包括的 |
Pattern.MULTILINE(?m) | 在多行模式下,表达式^和$分别匹配一行的开始和结束 |
Pattern.UNICODE_CASE(?u) | 当指定这个标记时,并且开启CASE_INSENSITIVE时,大小写不敏感的匹配按照Unicode来进行,默认只能在US_ASCII字符才能进行 |
Pattern pattern=Pattern.compile("\\w+@\\w+(.com)",Pattern.CASE_INSENSITIVE);
常用方法:
static Pattern | compile(String regex) 将给定的正则表达式编译为模式。 |
Matcher | matcher(CharSequence input) 创建一个匹配器,匹配给定的输入与此模式。 |
| find() 尝试找到匹配模式的输入序列的下一个子序列。 |
String | group() 返回与上一个匹配匹配的输入子序列。 |
boolean | matches() 尝试将整个区域与模式进行匹配。 |
int | start() 返回上一个匹配的起始索引。 |
boolean | lookingAt() 尝试将输入序列从区域开头开始与模式相匹配。 |
int | groupCount() 返回此匹配器模式中捕获组的数量。 |
String | replaceAll(String replacement) 将与模式匹配的输入序列的每个子序列替换为给定的替换字符串。 |
程序实例:
package com.luther.regx;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RehularExpression {
private static String regString="abcabcabcdefabc";
public static void main(String[] args) {
String []reg={"abc+","(abc)+","(abc){2,}"};
for(String regex:reg){
Pattern pattern=Pattern.compile(regex);
Matcher matcher = pattern.matcher(regString);
while(matcher.find()){
System.out.println("Match"+"\t"+regex+"\t"+matcher.group()+"\t"+matcher.start()+"\t"+(matcher.end()-1));
}
}
}
}
package com.luther.regx;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo {
static final String POEM=
"Twas brilind ew wrewr dsff\n"+
"dadw wwqwe wfwef werew\n"+
"dwewr frefre erfef";
public static void main(String[] args) {
Matcher matcher = Pattern.compile("(?m)(\\S+)\\s+((\\S+)\\s+(\\S+))$").matcher(POEM);
System.out.println(matcher.groupCount());
while(matcher.find()){
System.out.println(matcher.group()+"---");
}
}
}
package com.luther.regx;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Examine {
static String regString="1723484@qq.com";
public static void main(String[] args) {
Pattern pattern=Pattern.compile("\\w+@\\w+(.com)");
Matcher matcher = pattern.matcher(regString);
boolean matches = matcher.matches();
System.out.println(matches);
}
}
package com.luther.regx;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Demo {
static String nameString="iurwiur!!jje!uhuie!!!huheihf!!";
public static void main(String[] args) {
String[] split = nameString.split("!+");
for(String nString:split){
System.out.println(nString);
}
Pattern compile = Pattern.compile("!+");
Matcher matcher = compile.matcher(nameString);
String replaceAll = matcher.replaceFirst("----");
System.out.println(replaceAll);
//更换操作的字符串
Matcher reset = matcher.reset(replaceAll);
String replaceFirst = reset.replaceAll("****");
System.out.println(replaceFirst);
}
}
package com.luther.regx;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class BufDemo {
public static void main(String[] args) {
String nString="addewew ahudie owoeirur";
Pattern compile = Pattern.compile("[aeiou]");
Matcher matcher = compile.matcher(nString);
StringBuffer sb=new StringBuffer();
while(matcher.find()){
//遍历所有的替换操作再调用appendTail(sb);
matcher.appendReplacement(sb, matcher.group().toUpperCase());
}
matcher.appendTail(sb);
System.out.println(sb);
}
}
JavaScript的正则表达式:
i | 执行对大小写不敏感的匹配。 |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
m | 执行多行匹配。 |
str="abcabcssabc
常用方法:
str.match(reg);
reg.test(str);
reg.exec(str);
str.search(reg);
str.replace(reg,"!);
str.split(reg);
var str="abcabcsscabc";
var regx=/abc/g
var word=str.match(regx); //返回的是一个数组(out(abc abc abc))
var bool =regx.test(str);
dv.html(bool);//返回的是Boolean类型的数据 (ture)
var str="abcdabcabc";
var regx=/abc/g
var dv=$("div");
var s=regx.exec(str);
dv.html(s);//返回的是匹配的字符串 abc 如果没有的话返回的是null
var regx=/abc/g
var data="aadsa,sadsad,kk,ads,kk,abc";
var da=data.search(regx);//返回的是索引的位置(out 23)
dv.html(da);
var dv=$("div");
var data="aadsa,sadsad,kk,ads,kk,abc";
var regx=/,/g;
var a=data.replace(regx,"!");//把匹配到的字符与!进行替换,返回替换后的字符串
dv.html(a)
var dv=$("div");
var data="aadsa,sadsad,kk,ads,kk,abc";
var regx=/,/g;
var a=data.split(regx);//根据匹配到字符串进行分割,舍弃匹配到的字符
dv.html(a[0]+" "+a[1]);
代码实例:(下面的代码只是简单的操作了一下登录,并没有对表单进行判断)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JavaScript的正则演示</title>
<script type="text/javascript" src="jquery-3.1.1.js" charset="UTF-8"></script>
<script type="text/javascript">
var reg=/^\w{6,10}@[a-zA-Z]{0,5}(\.com)$/gi;
var regpassword=/^(?![^a-zA-Z]+$)(?![^0-9]+$)[a-zA-Z0-9]{8,20}$/gi;
$(function(){
$(":text:eq(0)").blur(function(){
if($(this).val().match(/^\w{6,10}$/)){
$(this).next().css("color","green").html("√");
}else{
$(this).next().css("color","red").html("X");
}
});
$(":password:eq(0)").blur(function(){
if($(this).val().match(regpassword)){
$(this).next().css("color","green").html("√");
}else{
$(this).next().css("color","red").html("密码不可以低于八位,且必须是数字与密码的组合");
}
});
$(":password:eq(1)").blur(function(){
if($(this).val()==($(":password:eq(0)").val())){
$(this).next().css("color","green").html("√");
}else{
$(this).next().css("color","red").html("两次密码不一致");
}
});
$(":text:eq(1)").blur(function(){
if(reg.test($(this).val())){
$(this).next().css("color","green").html("√");
}else{
$(this).next().css("color","red").html("X");
}
/* 返回的是注册成功的指 */
alert(reg.exec($(this).val()));
});
});
</script>
</head>
<body>
<form method="post">
<table align="center">
<tr>
<td>UserName:</td>
<td><input type="text" name="username"><span></span></td>
</tr>
<tr>
<td>Password</td>
<td><input type="password" name="password"><span></span></td>
</tr>
<tr>
<td>RePassword:</td>
<td><input type="password" name="repassword"><span></span></td>
</tr>
<tr>
<td>E-Mail</td>
<td><input type="text" name="mail"><span></span></td>
</tr>
<tr>
<td>Date</td>
<td><input type="date" name="date"></td>
</tr>
<tr><th colspan="2"><input type="submit" value="Login"><span></span></th></tr>
</table>
</form>
</body>
</html>
可以看出复杂的正匹配与Java的区别不是太大,如果想要了解JavaScript正则表达式的细节,建议参考这篇文章https://www.cnblogs.com/ghostgift/archive/2013/03/28/2980406.html#undefined
其中上面用到了一条正则表达式做一下简单的解释:
、
var regpassword=/^(?![^a-zA-Z]+$)(?![^0-9]+$)[a-zA-Z0-9]{8,20}$/gi;
这段代码是来判断我们的密码必须要有字母和数字的组合。
^:正则的开始
$:正则的结束
(?![^a-zA-Z]+$):从当前位置到结束前,匹配的字符串不能全为字母
(?![^0-9]+$):从当前位置到结束前,匹配的字符串不能全为数字