黑马程序员------javascript与正则表达式

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 


Javascript 与正则表达式

01-正则表达式(特点)

 

 1.正则表达式:符合一定规则的表达式。

  作用:用于专门操作字符串。

  特点:用一些特定的符号来表示一些代码操作。这样就简化书写。

  所以学习正则表达式,就是在学习一些特殊符号的使用。

 

  好处:可以简化对字符串的复杂操作。

  弊端:符号定义越多,正则越长,阅读性越差。

 

 2.具体操作功能:

 

 1)匹配:String matches方法。

 2)切割:String split();

 3)替换:String replaceAll();

 

 

 3.String类中方法:

  boolean matches(String regex) 

     告知此字符串是否匹配给定的正则表达式。

    

 

  public boolean matches(String regex)告知此字符串是否匹配给定的正则表达式。 

  调用此方法的 str.matches(regex) 形式与以下表达式产生的结果完全相同:

 

  Pattern.matches(regex, str)

 

  参数:

  regex - 用来匹配此字符串的正则表达式 

  返回:

  当且仅当此字符串匹配给定的正则表达式时,返回 true 

  抛出: 

  PatternSyntaxException - 如果正则表达式的语法无效

 

 

02-正则表达式(获取)

 

 

 1.正则表达式的第四个功能:

   4,获取:将字符串中的符合规则的子串取出。

 

  操作步骤:

  1,将正则表达式封装成对象。

  2,让正则对象和要操作的字符串相关联。

  3,关联后,获取正则匹配引擎。

  4,通过引擎对符合规则的子串进行操作,比如取出。

 

 2.类 Patternjava.util.regex

 

  1)正则表达式的编译表示形式。

 

  指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,

  依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,

  所以多个匹配器可以共享同一模式。

 

  因此,典型的调用顺序是

 

  Pattern p = Pattern.compile("a*b");

  Matcher m = p.matcher("aaaaab");

  boolean b = m.matches();

  2)方法摘要 

  static Pattern compile(String regex) 

     将给定的正则表达式编译到模式中。 

  Matcher matcher(CharSequence input) 

     创建匹配给定输入与此模式的匹配器。 

  static boolean matches(String regex, CharSequence input) 

     编译给定正则表达式并尝试将给定输入与其匹配。 

  String pattern() 

     返回在其中编译过此模式的正则表达式。 

  static Pattern compile(String regex, int flags) 

     将给定的正则表达式编译到具有给定标志的模式中。 

  int flags() 

     返回此模式的匹配标志。 

  String[] split(CharSequence input) 

     围绕此模式的匹配拆分给定输入序列。

 

 3.类 Matcherjava.util.regex 

 

  1)通过解释 Pattern 对 character sequence 执行匹配操作的引擎。

 

  通过调用模式的 matcher 方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:

 

  matches 方法尝试将整个输入序列与该模式匹配。

 

  lookingAt 尝试将输入序列从头开始与该模式匹配。

 

  find 方法扫描输入序列以查找与该模式匹配的下一个子序列。

 

  每个方法都返回一个表示成功或失败的布尔值。通过查询匹配器的状态可以获取关于成功匹配的更多信息

  2)方法摘要 

  int end() 

     返回最后匹配字符之后的偏移量。 

  boolean find() 

     尝试查找与该模式匹配的输入序列的下一个子序列。 

  boolean find(int start) 

     重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。 

  String group() 

     返回由以前匹配操作所匹配的输入子序列。 

  boolean lookingAt() 

     尝试将从区域开头开始的输入序列与该模式匹配。 

  boolean matches() 

     尝试将整个区域与模式匹配。 

  Pattern pattern() 

     返回由此匹配器解释的模式。 

  int start() 

     返回以前匹配的初始索引。 

  Matcher reset() 

     重置匹配器。 

  String replaceAll(String replacement) 

     替换模式与给定替换字符串相匹配的输入序列的每个子序列。


 

二、下表是元字符及其在正则表达式上下文中的行为的一个完整列表:

字 符

描                               述

\

将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。例如,'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 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o

{n,}

n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o'o{1,}' 等价于 'o+''o{0,}' 则等价于 'o*'

{n,m}

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)

匹配pattern 并获取这一匹配。在JScript 中则使用 $1…$9 属性。要匹配圆括号字符,请使用 '\('  '\)'

(?:pattern)

匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

(?=pattern)

正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern)

负向预查,在任何不匹配的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 

x|y

匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"'(z|f)ood' 则匹配 "zood" 或 "food" 

[xyz]

字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a' 

[^xyz]

负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p' 

[a-z]

字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。例如:[a-z]   [A-Z]   [0-9]

[^a-z]

负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。

\b

匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er' 

\B

匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'

\cx

匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 视为一个原义的 'c' 字符。 

\d

匹配一个数字字符。等价于 [0-9] 

\D

匹配一个非数字字符。等价于 [^0-9] 

\f

匹配一个换页符。等价于 \x0c 和 \cL

\n

匹配一个换行符。等价于 \x0a 和 \cJ

\r

匹配一个回车符。等价于 \x0d 和 \cM

\s

匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]

\S

匹配任何非空白字符。等价于 [^ \f\n\r\t\v]

\t

匹配一个制表符。等价于 \x09 和 \cI

\v

匹配一个垂直制表符。等价于 \x0b 和 \cK

\w

匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]' 

\W

匹配任何非单词字符。等价于 '[^A-Za-z0-9_]' 

\xn

匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, '\x41' 匹配 "A"'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.

\num

匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。 

\n

标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。

\nm

标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若  n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。

\nml

如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml

\un

匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)

 

三、正则表达式的常用方法:

 

regexp.test(string)

用来测试一个字符串是否能够被匹配。它返回turefalse两个值。

regexp.exec(string)

在指定的字符串中执行搜寻一个匹配,匹配的结果是通过一个数组返回。

 

四、与正则表达式有关的字符串对象的方法:

 

string.replace(pattern,string)

替换在正则表达式查找中找到的文本。

string.search(pattern)

通过正则表达式查找相应的字符串,只是判断有无匹配的字符串。如果查找成功,search返回匹配串的位置, 否则返回-1 

string.match(pattern)

match方法执行全局查找,查找结果存放在一个数组里。 

 

五、常用的正则表达式的操作符

 

Symbol

Function

\

转义符

(), (?:), (?=), []

括号

*, +, ?, {n}, {n,}, {n,m}

限定符

^, $, \anymetacharacter

定位符

|

 

 

八、一些常用的正则表达式示例: 

 

1、匹配所有的正数:^[0-9]+$

2、匹配所有的小数:^\-?[0-9]*\.?[0-9]*$

3匹配所有的整数:^\-?[0-9]+$

4、提取信息中的中文字符串: [\u4e00-\u9fa5]* ;  

5、提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 
6、提取信息中的中国手机号码:(86)*0*13\d{9} 
7、提取信息中的中国固定电话号码:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8} 
8、提取信息中的中国邮政编码:[1-9]{1}(\d+){5} 
9、提取信息中的中国身份证号码:\d{18}|\d{15} 
10、提取信息中的任何数字:(-?\d*)(\.\d+)? 
11匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/

 

则表达式用于字符串处理、表单验证等场合,实用高效。
现将一些常用的表达式收集于此,以备不时之需。

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在 内)[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2ASCII字符计1

匹配空白行的正 则表达式:\n\s*\r
评注:可以用来删除空白行

匹配HTML标记的正则表达式:<(\S*?) [^>]*>.*?</\1>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对 于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空 格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.] \w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA- z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16 字节,允许字母数字下划线)^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用

匹配国内电话号 码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222  021-87888822

匹 配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]\d{5}(?! \d)
评注:中国邮政编码为6位数字

匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18

匹 配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用

匹配特定数字:
^[1-9]\d*$    //匹配正整数
^-[1-9]\d*$  //匹配负整数
^-?[1-9]\d*$ //匹配整数
^[1-9]\d*|0$  //匹配非负整数(正整数 + 0
^-[1-9]\d*|0$ //匹配非正整数(负整数 + 0
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$  //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非负浮点数(正浮点 数 + 0
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$//匹配非正浮点数(负浮点 数 + 0
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$//匹配由26 个英文字母组成的字符串
^[A-Z]+$//匹配由26个英文字母的大写组成的字符串
^[a-z]+$//匹配由26个英文字母 的小写组成的字符串
^[A-Za-z0-9]+$//匹配由数字和26个英文字母组成的字符串
^\w+$//匹配由数字、26个 英文字母或者下划线组成的字符串
评注:最基本也是最常用的一些表达式

 

加了时间验证的

^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$



-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值