怎么用正则匹配任意字符串表达式匹配一个字符串中有任意一个“”()字符

正则表达式匹配任意字符(包括换行符)的写法
字体:[ ] 类型:转载 时间:
在正则中,匹配任意字符,其实写法网上有很多,但因为各种软件或程序写法不支持等原因导致的问题,大家可以多研究。
今天在Java中想使用正则表达式来获取一段文本中的任意字符。于是很随意得就写出如下匹配规则: (.*) 结果运行之后才发现,无法获得换行之后的文本。于是查了一下手册,才发现正则表达式中,“.”(点符号)匹配的是除了换行符“\n”以外的所有字符。同时,手册上还有一句话:要匹配包括 '\n' 在内的任何字符,请使用像 '[.\n]' 的模式。于是我将正则表达式的匹配规则修改如下: ([.\n]*),当然,如果是在java程序中直接写到话,需要改为([.\\n]*) 结果再次运行程序,发现什么内容也取不到了。我百思不得其解,又将其修改为如下规则: ([.|\n]*) 以及 ([\n.]*) 结果还是不行,什么内容都取不到。看来点符号和换行符卯上劲了~ 然后上网一查,虽然没有查出上述规则到底是什么地方出问题了,但是查出了一个解决办法,经过一试,果然可以匹配包括换行符在内的任意字符,以下为正确的正则表达式匹配规则: ([\s\S]*) 同时,也可以用 “([\d\D]*)”、“([\w\W]*)” 来表示。 在文本文件里, 这个表达式可以匹配所有的英文 /[ -~]/ 这个表达式可以匹配所有的非英文(比如中文) /[^ -~]/ /是VI里用的. 你在editplus或程序里不需要/
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具leizhimin 的BLOG
用户名:leizhimin
文章数:716
评论数:2653
注册日期:
阅读量:24883
阅读量:261141
阅读量:998893
阅读量:149267
51CTO推荐博文
Java中使用正则表达式校验字符串
正则表达式是某一位伟大的数学家发明的,现在已经形成了一个ISO标准,这个标准和编程语言没有关系。至于具体谁发明的,怎么发明的,我也忘记了:)。
正则表达式简单理解就是用来匹配字符串,看看所给字符串是否与正则表达式匹配,通过匹配关系,可以做很多事情,比如搜索引擎、替换、校验、分割等等。但最基本的还是用来校验匹配关系。 Java SE中早已实现了正则表达式的引擎,并且有着广泛的应用。
参考JDK API文档,Java的正则表达式API集中在java.util.regex包里面,其下有两个核心类:
软件包 java.util.regex
用于匹配字符序列与正则表达式指定模式的类。
MatchResult 匹配操作的结果。
Matcher 通过解释 Pattern 对 字符序列 执行匹配操作的引擎。
Pattern 正则表达式的编译表示形式。
PatternSyntaxException 抛出未经检查的异常,表明正则表达式模式中的语法错误。
具体功能很多,用法也很灵活,现在给出一个例子,用来校验一个字符串:
这个字符串必须符合如下格式:
1、第一个字母为R,后跟两个数字,然后是一个下划线,后面再跟两个字母,两个数字;还有可以跟一个下划线带两个数字。
2、十一个数字。
3、年度:四个数字,首位必须为1或者2。
4、月份:01~12
以上四个部分之间用横杠连接。
例如,一下是格式良好的字符串
R05_QD01--2007-12
R23_QD21_02--2007-01
下面给出个例子看看:
import java.util.regex.P import java.util.regex.M /** * Created by IntelliJ IDEA. * File: RegExDemo.java * User: leizhimin * Date:
15:55:24 */ public class RegExDemo { &&&&private static String regEx1 = "R\\d{2}_[A-Z]{2}\\d{2}(_\\d{2})?-\\d{11}-[1|2]\\d{3}-0[1-9]"; &&&&private static String regEx2 = "R\\d{2}_[A-Z]{2}\\d{2}(_\\d{2})?-\\d{11}-[1|2]\\d{3}-1[012]"; &&&&private static String regEx3 = "R\\d{2}_[A-Z]{2}\\d{2}(_\\d{2})?-\\d{11}-[1|2]\\d{3}-[NABCXQD]"; &&&&/** &&&& * 验证报表代码是否符合编码规则 &&&& * &&&& * @param rptCode 报表代码 &&&& * @return 验证结果,验证通过返回true,失败返回false &&&& */ &&&&public static boolean isRegularRptCode(String rptCode) { &&&&&&&&Pattern p1 = pile(regEx1); &&&&&&&&Pattern p2 = pile(regEx2); &&&&&&&&Pattern p3 = pile(regEx3); &&&&&&&&Matcher m1 = p1.matcher(rptCode); &&&&&&&&Matcher m2 = p2.matcher(rptCode); &&&&&&&&Matcher m3 = p3.matcher(rptCode); &&&&&&&&boolean rs1 = m1.matches(); &&&&&&&&boolean rs2 = m2.matches(); &&&&&&&&boolean rs3 = m3.matches(); &&&&&&&&return rs1 || rs2 || rs3; &&&&} &&&&public static void main(String args[]) { &&&&&&&&String s1 = "R05_QD01--2007-12"; &&&&&&&&boolean flag1 = isRegularRptCode(s1); &&&&&&&&System.out.println("字符串 " + s1 + " 验证" + (flag1 ? "成功!" : "失败!")); &&&&&&&&String s2 = "R23_QD21_02--2007-01"; &&&&&&&&boolean flag2 = isRegularRptCode(s2); &&&&&&&&System.out.println("字符串 " + s2 + " 验证" + (flag2 ? "成功!" : "失败!")); &&&&} }
运行结果:
字符串 R05_QD01--2007-12 验证成功! 字符串 R23_QD21_02--2007-01 验证成功! Process finished with exit code 0
有关正则表达式的用法很简单,其实最关键的是要能写出所需要的正则表达式。有关语法可以参考Java API的java.util.regex.Pattern类。
另外,我在附件中给出了网上找到一个正则表达式文档,很不错,一起放上来。
下面是另外一个API测试例子:
import java.util.regex.M import java.util.regex.P /** * Created by IntelliJ IDEA. * * @author leizhimin
16:00:49 */ public class TestPattern { &&&&&&&&public static void main(String args[]) { &&&&&&&&&&&&&&&&test1(); &&&&&&&&&&&&&&&&test2(); &&&&&&&&&&&&&&&&test3(); &&&&&&&&} &&&&&&&&public static void test1() { &&&&&&&&&&&&&&&&//创建正则表达式的模式对象 &&&&&&&&&&&&&&&&Pattern p = pile("a*b");//零次或多次a,并跟着b &&&&&&&&&&&&&&&&//通过模式对象创建一个匹配对象 &&&&&&&&&&&&&&&&Matcher m1 = p.matcher("aaaaabxyzabt"); &&&&&&&&&&&&&&&&Matcher m2 = p.matcher("aaaaab"); &&&&&&&&&&&&&&&&//尝试将整个区域与模式匹配。当且仅当整个区域序列匹配此匹配器的模式时才返回 true。 &&&&&&&&&&&&&&&&boolean b11 = m1.matches(); &&&&&&&&&&&&&&&&boolean b12 = m2.matches(); &&&&&&&&&&&&&&&&System.out.println(b11 + "\t" + b12); &&&&&&&&&&&&&&&&//编译给定正则表达式并尝试将给定输入与其匹配。 &&&&&&&&&&&&&&&&boolean b21 = Pattern.matches("a*b", "aaaaabxyzabt"); &&&&&&&&&&&&&&&&boolean b22 = Pattern.matches("a*b", "aaaaab"); &&&&&&&&&&&&&&&&System.out.println(b21 + "\t" + b22); &&&&&&&&&&&&&&&&System.out.println(p.flags()); &&&&&&&&} &&&&&&&&/** &&&&&&&& * 进行大小写忽略和多行模式测试 &&&&&&&& */ &&&&&&&&public static void test2() { &&&&&&&&&&&&&&&&Pattern p1 = pile("a*b", Pattern.CASE_INSENSITIVE); &&&&&&&&&&&&&&&&Pattern p2 = pile("a*b", Pattern.MULTILINE); &&&&&&&&&&&&&&&&Matcher m11 = p1.matcher("aaaaaBABzAbt"); &&&&&&&&&&&&&&&&Matcher m12 = p1.matcher("Ab"); &&&&&&&&&&&&&&&&Matcher m21 = p2.matcher("a\n" + "b"); &&&&&&&&&&&&&&&&Matcher m22 = p2.matcher("ab"); &&&&&&&&&&&&&&&&boolean b11 = m11.matches(); &&&&&&&&&&&&&&&&boolean b12 = m12.matches(); &&&&&&&&&&&&&&&&System.out.println(b11 + "\t" + b12); &&&&&&&&&&&&&&&&boolean b21 = m21.matches(); &&&&&&&&&&&&&&&&boolean b22 = m22.matches(); &&&&&&&&&&&&&&&&System.out.println(b21 + "\t" + b22); &&&&&&&&&&&&&&&&System.out.println(p1.flags());&&&&&&&&&&&&&&&&&&&&&&&&&&&& //返回此模式的匹配标志。 &&&&&&&&&&&&&&&&System.out.println(p1.pattern());&&&&&&&&&&&&&&&&&&&&&&&& //返回在其中编译过此模式的正则表达式。 &&&&&&&&&&&&&&&&System.out.println(Pattern.quote("aaaaa"));&&&& //返回指定 String 的字面值模式 String。 &&&&&&&&&&&&&&&&String[] arr1 = p1.split("xabyayAbt");&&&&&&&&&&&&&&&&//围绕此模式的匹配拆分给定输入序列。 &&&&&&&&&&&&&&&&for (String s : arr1) { &&&&&&&&&&&&&&&&&&&&&&&&System.out.println(s); &&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&String[] arr2 = p1.split("xabyayAbt", 2);&&&&&&&& //围绕此模式的匹配拆分给定输入序列。 &&&&&&&&&&&&&&&&for (String s : arr2) { &&&&&&&&&&&&&&&&&&&&&&&&System.out.println(s); &&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&System.out.println(p1.toString());&&&&&&&&&&&&&&&&&&&&&&&&//返回此模式的字符串表示形式。 &&&&&&&&} &&&&&&&&public static void test3() { &&&&&&&&&&&&&&&&Pattern p = pile("cat"); &&&&&&&&&&&&&&&&Matcher m = p.matcher("cat two cats in the yard"); &&&&&&&&&&&&&&&&System.out.println(m.groupCount()); &&&&&&&&&&&&&&&&System.out.println(m.matches()); &&&&&&&&&&&&&&&&System.out.println(m.find()); &&&&&&&&&&&&&&&&System.out.println(m.find(8)); &&&&&&&&&&&&&&&&StringBuffer sb = new StringBuffer(); &&&&&&&&&&&&&&&&while (m.find()) { &&&&&&&&&&&&&&&&&&&&&&&&m.appendReplacement(sb, "dog"); &&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&m.appendTail(sb); &&&&&&&&&&&&&&&&System.out.println(sb.toString()); &&&&&&&&&&&&&&&&System.out.println(m.replaceAll("person")); &&&&&&&&&&&&&&&&System.out.println(m.replaceFirst("person")); &&&&&&&&&&&&&&&&while (m.find()) { &&&&&&&&&&&&&&&&&&&&&&&&System.out.println(m.group()); &&&&&&&&&&&&&&&&} &&&&&&&&} }
&本文出自 “” 博客,转载请与作者联系!
了这篇文章
附件下载:  
类别:┆阅读(0)┆评论(0)
16:10:31 17:09:54
请输入验证码:当前位置:& & &
正则中需要转义的特殊字符小结
评论: 0|来自: 转载
摘要: 正则表达式中的特殊字符,就是一些有特殊含义的字符,如“*.txt”中的*,简单的说就是表示任何字符串的意思&
如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。需要转义
匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n' 或 ‘\r'。要匹配 $ 字符本身,请使用 \$。
标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
标记一个中括号表达式的开始。要匹配 [,请使用 \[。
匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n' 匹配字符 ‘n'。'\n' 匹配换行符。序列 ‘\\' 匹配 “\”,而 ‘\(' 则匹配 “(”。
匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
标记限定符表达式的开始。要匹配 {,请使用 \{。
指明两项之间的一个选择。要匹配 |,请使用 \|。所以是 复制代码 代码如下:* . ? + $ ^ [ ] ( ) { } | \ /
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
上一篇:下一篇:
扫二维码扫描二维码,即刻与本站小编亲密互动,还有精美礼品等你来拿!
联系邮箱有更好的想法,联系我们吧!发邮件到正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
3.1 普通字符
由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。
3.2 非打印字符
匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
匹配一个换页符。等价于 \x0c 和 \cL。
匹配一个换行符。等价于 \x0a 和 \cJ。
匹配一个回车符。等价于 \x0d 和 \cM。
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
匹配一个制表符。等价于 \x09 和 \cI。
匹配一个垂直制表符。等价于 \x0b 和 \cK。
3.3 特殊字符
所谓特殊字符,就是一些有特殊含义的字符,如上面说的”*.txt”中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。
匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。
标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
标记一个中括号表达式的开始。要匹配 [,请使用 \[。
匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\\’ 匹配 “\”,而 ‘\(’ 则匹配 “(”。
匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
标记限定符表达式的开始。要匹配 {,请使用 \{。
指明两项之间的一个选择。要匹配 |,请使用 \|。
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
3.4 限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。
*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
正则表达式的限定符有:
匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。
n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。
m 和 n 均为非负整数,其中n &= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
 3.5 定位符
用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。不能对定位符使用限定符。
用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。
其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。
3.7 后向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 ‘\n’ 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
可以使用非捕获元字符 ‘?:’, ‘?=’, or ‘?!’ 来忽略对相关匹配的保存。
4. 各种操作符的运算优先级
相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:
(), (?:), (?=), []
圆括号和方括号
*, +, ?, {n}, {n,}, {n,m}
^, $, \anymetacharacter
位置和顺序
“或”操作
5. 全部符号解释 
将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,’n’ 匹配字符 “n”。’\n’ 匹配一个换行符。序列 ‘\\’ 匹配 “\” 而 “\(” 则匹配 “(”。
匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。
n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。
m 和 n 均为非负整数,其中n &= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,’o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。
匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。
匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 ‘\(’ 或 ‘\)’。
(?:pattern)
匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如, ‘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”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
匹配 x 或 y。例如,’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。
字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p'。
字符范围。匹配指定范围内的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。
负值字符范围。匹配任何不在指定范围内的任意字符。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范围内的任意字符。
匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
匹配非单词边界。’er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
匹配一个数字字符。等价于 [0-9]。
匹配一个非数字字符。等价于 [^0-9]。
匹配一个换页符。等价于 \x0c 和 \cL。
匹配一个换行符。等价于 \x0a 和 \cJ。
匹配一个回车符。等价于 \x0d 和 \cM。
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
匹配一个制表符。等价于 \x09 和 \cI。
匹配一个垂直制表符。等价于 \x0b 和 \cK。
匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。
匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,’\x41′ 匹配 “A”。’\x041′ 则等价于 ‘\x04′ & “1″。正则表达式中可以使用 ASCII 编码。.
匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,’(.)\1′ 匹配两个连续的相同字符。
标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。
6. 部分例子
正则表达式
/\b([a-z]+) \1\b/gi
一个单词连续出现的位置
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
将一个URL解析为协议、域、端口及相对路径
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/
定位章节的位置
A至z共26个字母再加一个-号。
可匹配chapter,而不能terminal
可匹配chapter,而不能aptitude
/Windows(?=95 |98 |NT )/
可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次
7. 正则表达式匹配规则
7.1 基本模式匹配
一切从最基本的开始。模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如:
这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串”once upon a time”匹配,与”There once was a man from NewYork”不匹配。正如如^符号表示开头一样,$符号用来匹配那些以给定模式结尾的字符串。
这个模式与”Who kept all of this cash in a bucket”匹配,与”buckets”不匹配。字符^和$同时使用时,表示精确匹配(字符串与模式一样)。例如:
只匹配字符串”bucket”。如果一个模式不包括^和$,那么它与任何包含该模式的字符串匹配。例如:模式
There once was a man from NewYork
Who kept all of his cash in a bucket.
是匹配的。
在该模式中的字母(o-n-c-e)是字面的字符,也就是说,他们表示该字母本身,数字也是一样的。其他一些稍微复杂的字符,如标点符号和白字符(空格、制表符等),要用到转义序列。所有的转义序列都用反斜杠(\)打头。制表符的转义序列是:\t。所以如果我们要检测一个字符串是否以制表符开头,可以用这个模式:
类似的,用\n表示“新行”,\r表示回车。其他的特殊符号,可以用在前面加上反斜杠,如反斜杠本身用\\表示,句号.用\.表示,以此类推。
7.2 字符簇
在INTERNET的程序中,正规表达式通常用来验证用户的输入。当用户提交一个FORM以后,要判断输入的电话号码、地址、EMAIL地址、信用卡号码等是否有效,用普通的基于字面的字符是不够的。
所以要用一种更自由的描述我们要的模式的办法,它就是字符簇。要建立一个表示所有元音字符的字符簇,就把所有的元音字符放在一个方括号里:
[AaEeIiOoUu]
这个模式与任何元音字符匹配,但只能表示一个字符。用连字号可以表示一个字符的范围,如:
[a-z] //匹配所有的小写字母
[A-Z] //匹配所有的大写字母
[a-zA-Z] //匹配所有的字母
[0-9] //匹配所有的数字
[0-9\.\-] //匹配所有的数字,句号和减号
[ \f\r\t\n] //匹配所有的白字符
同样的,这些也只表示一个字符,这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串,比如”z2″、”t6″或”g7″,但不是”ab2″、”r2d3″ 或”b52″的话,用这个模式:
^[a-z][0-9]$
尽管[a-z]代表26个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。
前面曾经提到^表示字符串的开头,但它还有另外一个含义。当在一组方括号里使用^是,它表示“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子,我们要求第一个字符不能是数字:
^[^0-9][0-9]$
这个模式与”&5″、”g7″及”-2″是匹配的,但与”12″、”66″是不匹配的。下面是几个排除特定字符的例子:
[^a-z] //除了小写字母以外的所有字符
[^\\\/\^] //除了(\)(/)(^)之外的所有字符
[^\”\’] //除了双引号(”)和单引号(’)之外的所有字符
特殊字符”.” (点,句号)在正规表达式中用来表示除了“新行”之外的所有字符。所以模式”^.5$”与任何两个字符的、以数字5结尾和以其他非“新行”字符开头的字符串匹配。模式”.”可以匹配任何字符串,除了空串和只包括一个“新行”的字符串。
PHP的正规表达式有一些内置的通用字符簇,列表如下:
字符簇含义
[[:alpha:]] 任何字母
[[:digit:]] 任何数字
[[:alnum:]] 任何字母和数字
[[:space:]] 任何白字符
[[:upper:]] 任何大写字母
[[:lower:]] 任何小写字母
[[:punct:]] 任何标点符号
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]
7.3 确定重复出现
到现在为止,你已经知道如何去匹配一个字母或数字,但更多的情况下,可能要匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数。
字符簇 含义
^[a-zA-Z_]$ 所有的字母和下划线
^[[:alpha:]]{3}$ 所有的3个字母的单词
^a{4}$ aaaa
^a{2,4}$ aa,aaa或aaaa
^a{1,3}$ a,aa或aaa
^a{2,}$ 包含多于两个a的字符串
^a{2,} 如:aardvark和aaab,但apple不行
a{2,} 如:baad和aaa,但Nantucket不行
\t{2} 两个制表符
.{2} 所有的两个字符
这些例子描述了花括号的三种不同的用法。一个数字,{x}的意思是“前面的字符或字符簇只出现x次”;一个数字加逗号,{x,}的意思是“前面的内容出现x或更多的次数”;两个用逗号分隔的数字,{x,y}表示“前面的内容至少出现x次,但不超过y次”。我们可以把模式扩展到更多的单词或数字:
^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划线的字符串
^[0-9]{1,}$ //所有的正数
^\-{0,1}[0-9]{1,}$ //所有的整数
^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ //所有的小数
最后一个例子不太好理解,是吗?这么看吧:与所有以一个可选的负号(\-{0,1})开头(^)、跟着0个或更多的数字([0-9]{0,})、和一个可选的小数点(\.{0,1})再跟上0个或多个数字([0-9]{0,}),并且没有其他任何东西($)。下面你将知道能够使用的更为简单的方法。
特殊字符”?”与{0,1}是相等的,它们都代表着:“0个或1个前面的内容”或“前面的内容是可选的”。所以刚才的例子可以简化为:
^\-?[0-9]{0,}\.?[0-9]{0,}$
特殊字符”*”与{0,}是相等的,它们都代表着“0个或多个前面的内容”。最后,字符”+”与 {1,}是相等的,表示“1个或多个前面的内容”,所以上面的4个例子可以写成:
^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划线的字符串
^[0-9]+$ //所有的正数
^\-?[0-9]+$ //所有的整数
^\-?[0-9]*\.?[0-9]*$ //所有的小数
当然这并不能从技术上降低正规表达式的复杂性,但可以使它们更容易阅读。
正则表达式非常有用,查找、匹配、处理字符串、替换和转换字符串,输入输出等。而且各种语言都支持,例如.NET正则库,JDK正则包, Perl, JavaScript等各种脚本语言都支持正则表达式。下面整理一些常用的正则表达式。
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 &n&。'\n' 匹配一个换行符。序列 '\\' 匹配 &\& 而 &\(& 则匹配 &(&。
匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
匹配前面的子表达式零次或多次。例如,zo* 能匹配 &z& 以及 &zoo&。* 等价于{0,}。
匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 &zo& 以及 &zoo&,但不能匹配 &z&。+ 等价于 {1,}。
匹配前面的子表达式零次或一次。例如,&do(es)?& 可以匹配 &do& 或 &does& 中的&do& 。? 等价于 {0,1}。
n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 &Bob& 中的 'o',但是能匹配 &food& 中的两个 o。
n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 &Bob& 中的 'o',但能匹配 &foooood& 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
m 和 n 均为非负整数,其中n &= m。最少匹配 n 次且最多匹配 m 次。例如,&o{1,3}& 将匹配 &fooooood& 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 &oooo&,'o+?' 将匹配单个 &o&,而 'o+' 将匹配所有 'o'。
匹配除 &\n& 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。
(?:pattern)
匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 &或& 字符 (|) 来组合一个模式的各个部分是很有用。例如, '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&。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
匹配 x 或 y。例如,'z|food' 能匹配 &z& 或 &food&。'(z|f)ood' 则匹配 &zood& 或 &food&。
字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 &plain& 中的 'a'。
负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 &plain& 中的'p'。
字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配&never& 中的 'er',但不能匹配 &verb& 中的 'er'。
匹配非单词边界。'er\B' 能匹配 &verb& 中的 'er',但不能匹配 &never& 中的 'er'。
匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
匹配一个数字字符。等价于 [0-9]。
匹配一个非数字字符。等价于 [^0-9]。
匹配一个换页符。等价于 \x0c 和 \cL。
匹配一个换行符。等价于 \x0a 和 \cJ。
匹配一个回车符。等价于 \x0d 和 \cM。
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
匹配一个制表符。等价于 \x09 和 \cI。
匹配一个垂直制表符。等价于 \x0b 和 \cK。
匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 &A&。'\x041' 则等价于 '\x04' & &1&。正则表达式中可以使用 ASCII 编码。
匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。
标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
使正则表达式对大小写不敏感, (?-i)是关闭大小写不敏感
(?i)te(?-i)st应该匹配TEst,但是不能匹配teST或TEST.
开启“单行模式”,即点号“.”匹配新行符
开启“多行模式”,即“^”和“$”匹配新行符的前面和后面的位置。
只能输入数字
只能输入n位的数字
只能输入至少n位的数字
只能输入m~n位的数字
^(0|[1-9][0-9]*)$
只能输入零和非零开头的数字
^[0-9]+(.[0-9]{2})?$
只能输入有两位小数的正实数
^[0-9]+(.[0-9]{1,3})?$
只能输入有1~3位小数的正实数
^\+?[1-9][0-9]*$
只能输入非零的正整数
^\-[1-9][]0-9&*$
只能输入非零的负整数
只能输入长度为3的字符
^[A-Za-z]+$
只能输入由26个英文字母组成的字符串
^[A-Za-z0-9]+$
只能输入由数字和26个英文字母组成的字符串
只能输入由数字、26个英文字母或者下划线组成的字符串
^[a-zA-Z]\w{5,17}$
验证用户密码:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
[^%&',;=?$\x22]+
验证是否含有^%&',;=?$\&等字符
^[\u4e00-\u9fa5]{0,}$
只能输入汉字
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
验证Email地址
^\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
验证InternetURL
^\d{15}|\d{18}$
验证身份证号(15位或18位数字)
^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$
验证IP地址
匹配两个两个重叠出现的字符
例如,&aabbc11asd&, 返回结果为aa bb 11三组match
&(?&tag&[^\s&]+)[^&]*&.*&/\k&tag&&
匹配成对的HTML标签
不出现,负声明
下例演示如何取得一个&a&标签对中的全部内容,即使其中包含别的HTML tag。
string newsContent = @&url:&a href=&&1.html&&&&img src=&&1.gif&&&test&span style=&&color:&&&
Regex&/span&&/a&.&;
Regex regEnd = new Regex(@&&\s*a[^&]*&([^&]|&(?!/a))*&\s*/a\s*&&,RegexOptions.Multiline);
常用的组匹配:(实用)
匹配exp并且捕获到一个自动命名的组
(?&name&exp)
匹配exp并且捕获到组’name’
exp出现在声明右侧,但exp不作为匹配
括号中的模式必须出现在声明右侧,但不作为匹配的一部分 ,例如:
输入: public keywod string &abc&;
正则:\b\w+(?=ing\b),返回“str”,
意思为:匹配以ing结束的单词,但ing不作为返回
exp出现在声明左侧,但exp不作为匹配
括号中的模式必须出现在声明左侧,但不作为匹配的一部分 ,例如:
输入: public remember string &abc&;
正则:(?&=\bre)\w+\b,返回“member”,
意思为:匹配以re开头的单词,但re不作为返回
exp不出现在声明右侧,但exp不作为匹配
括号中的模式必须不出现在声明右侧 ,例如:
输入: remember aqa bqu &abc&;
正则:\b\w*q(?!u)\w*\b,返回“aqa”,
意思为:匹配带q后面不是跟随u的单词
exp不出现在声明左侧,但exp不作为匹配
输入:public string keywod = &abc&; string value = &test&;
目的:匹配 关键字=&&,例如获得关键字keyword,value;获得等于的值abc和test
表达式:string (?&x&[^=]*?) *= *(?&y&[^;]*?);
private void ParseKeywords(string input)
System.Text.RegularExpressions.MatchCollection mc =
System.Text.RegularExpressions.Regex.Matches(input, @&string (?&x&[^=]*?) *= *(?&y&[^;]*?);&);
if (mc != null && mc.Count & 0)
foreach (System.Text.RegularExpressions.Match m in mc)
string keyword = m.Groups[&x&].V
string value = m.Groups[&y&].V
2. 匹配并替换
输入:public &%=classname%&Extension : IExt
目的:匹配 &%= %&中间的classname并替换
表达式:&%=.*%&
private string Replace(string input)
return Regex.Replace(input, @&&%=.*%&&, new MatchEvaluator(RefineCodeTag), RegexOptions.Singleline);
string RefineCodeTag(Match m)
string x = m.ToString();
x = Regex.Replace(x, &&%=&, &&);
x = Regex.Replace(x, &%&&, &&);
return x.Trim() + &,&;
正则表达式选项RegexOptions:
ExplicitCapture
只有定义了命名或编号的组才捕获
IgnoreCase
不区分大小写
IgnorePatternWhitespace
消除模式中的非转义空白并启用由 # 标记的注释。
多行模式,其原理是修改了^和$的含义
SingleLine
单行模式,和MultiLine相对应
正则表达式替换的其他功能:
把匹配的第number组替换成替换表达式
这段代码返回的是 “01 012 03 05”
就是说,对组一的每个匹配结果都用&0$1&这个表达式来替换,&0$1&中&$1&由组1匹配的结果代入
public static void Main()
string s = &1 12 3 5&;
s = Regex.Replace(s,@&(\d+)(?#这个是注释)&,&0$1&,piled|RegexOptions.IgnoreCase);
Console.WriteLine(s);
Console.ReadLine();
把匹配的组名为&name&的组替换成表达式,
上例的Regex expression改成@&(?&name&\d+)(?#这个是注释)&后面的替换式改为&0${name}&结果是一样的
做$的转义符,如上例表达式改成@&(?&name&\d+)(?#这个是注释)&和&$$${name}&,则结果为&$1 $12 $3 $5&
替换整个匹配
替换匹配前的字符
替换匹配后的字符
替换最后匹配的组
替换整个字符串
3. 匹配URL中文件名
目的:从URL地址中提取文件名
表达式:s=s.replace(/(.*\/){0,}([^\.]+).*/ig,&$2&) ;
string s = &&;
s = s.replace(/(.*\/){0,}([^\.]+).*/ig, &$2&) ; 
阅读(...) 评论()

我要回帖

更多关于 正则表达式任意字符串 的文章

 

随机推荐