正则表达式,适用多种语言,不同语言正则基本相同,使用正则很多时候能极大的提高效率。
这里我根据自己的想法总结一些常用的正则表达式,并附加一些例子。写的不对的地方还希望大家能够支出。
正则表达式语法
"\"为转移符如"\d"在java中为"\\d"
我将之分成了三大类
一、匹配项——真正用于匹配的规则
\d 数字字符匹配。等效于 [0-9]。
\D 非数字字符匹配。等效于 [^0-9]。
\w 匹配任何字类字符,包括下划线。与"[A-Za-z0-9_]"等效。
\W 与任何非单词字符匹配。与"[^A-Za-z0-9_]"等效。
\n 换行符匹配。等效于 \x0a 和 \cJ
\r 匹配一个回车符。等效于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。
\S 匹配任何非空白字符。
\f 换页符匹配。等效于 \x0c 和 \cL。
. 匹配除"\r\n"之外的任何单个字符。
\b 匹配一个字边界,即字与空格间的位置,单词边界。例如,"er\b"匹配"never"中的"er",但不匹配"verb"中的"er"。
\B 非字边界匹配。
\cx 匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回车符。
x的值必须在 A-Z 或 a-z 之间。如果不是这样,则假定 c 就是"c"字符本身。
二、匹配限制项——匹配的范围
^ 放在开头,匹配从第一个开始的字符,放在"[]"中表示非
$ 放在结尾,匹配最后一个字符
* 0次或多次,等效于{0,}
+ 1次或多次,等效于{1,}
? 0次或1次,等效于{0,1}。如紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,
匹配模式为非贪心模式。例如,在字符串"oooo"中,"o+?"只匹配单个"o",而"o+"匹配所有"o"。
{n} n 是非负整数。正好匹配 n 次。例如,"o{2}"与"food"中的两个"o"匹配。
{n,} n 是非负整数。至少匹配 n 次。
{n,m} m 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。
下面是限制范围并不属于限定符
x|y 匹配 x 或 y。
[xyz] 字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。
[^xyz] 反向字符集。匹配未包含的任何字符。
[a-z] 字符范围。匹配指定范围内的任何字符。
[^a-z] 反向范围字符。匹配不在指定的范围内的任何字符。
(xyz) 匹配xyz这个整体
三、匹配修饰项——不存储供以使用的匹配,非捕获匹配
(?:pattern) 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。
这对于用"or"字符 (|) 组合模式部件的情况很有用。
例如,'industr(?:y|ies) 是比 'industry|industries' 更经济的表达式。
(?=pattern) 执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。
它是一个非捕获匹配,即不能捕获供以后使用的匹配。
例如,'Windows (?=95|98|NT|2000)' 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。
预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。
(?!pattern) 执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。
它是一个非捕获匹配,即不能捕获供以后使用的匹配。
例如,'Windows (?!95|98|NT|2000)' 匹配"Windows 3.1"中的 "Windows",但不匹配"Windows 2000"中的"Windows"。
预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。
参考:http://www.runoob.com/java/java-regular-expressions.html
下面写几个例子以供熟悉
java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
String line = "schoolmate";
String regex = "school";//正则
Pattern patt = Pattern.compile(regex);
Matcher m = patt.matcher(line);
//等同于Pattern.matches(regex, line)
System.out.println(m.matches());//结果,false
System.out.println(m.lookingAt());//结果,true
// matcher 要求整个序列都匹配,而lookingAt 不要求。
common("kljlk@klc.sd");
}
//常用的验证项
public static void common(String str){
System.out.println("原有的字符串"+str);
System.out.println("是否是数字:"+Pattern.matches("^[0-9]+$", str));
System.out.println("是否有汉字:"+Pattern.compile("[\u4e00-\u9fa5]").matcher(str).find());
System.out.println("验证手机号:"+Pattern.matches("^0?1[34578]\\d{9}$", str));
System.out.println("验证邮箱:"+Pattern.matches("^[a-zA-Z0-9_-]+@\\w+\\.[a-zA-Z0-9]{2,3}$", str));
}
}
JS正则表达式的创建
1)直接量创建法:
var pattern=/s$/;
像字符串的创建可以用一对引号一样,正则表达式的创建则可以用一对斜杠号(//)
2)对象创建法:
var pattern=new RegExp(“s$”); //这个式子与上面那个事等价的
<script>
var str = " a";
console.info("验证手机号:"+/^0?1[134578]\d{9}/.test(str))
console.info("验证有汉字:"+/[\u4e00-\u9fa5]/.test(str))
console.info("验证邮箱:"+/^[a-zA-Z0-9_-]+@\w+\.[a-zA-Z0-9]{2,3}$/.test(str))
str = str.replace(/(^\s*)|(\s*$)/g,"");//去除首尾空格,解决trim()不通用的问题
console.info(str)
</script>