java.util.regex.Pattern   模式类:用来表示一个编译过的正则表达式。

java.util.regex.Matcher   匹配类:用模式匹配一个字符串所表达的抽象结果。

二、先看一个简单的例子:

需求:从字符串:{"_type":"FQDN","_oid":"51a867e4773da1128b1422ad"} 中取出这段数字:51a867e4773da1128b1422ad

没有用过正则表达式的程序员可能分为两步获取

1. 用String类的indexOf方法获取51a867e4773da1128b1422ad的初始位置

2. 用String类的subString方法取出51a867e4773da1128b1422ad

用这种方法的缺点是代码可阅读性很差,即我们常说的hard code

如果用正则表达式则可以用以下的方法:

String reg ="[0-9A-Za-z]{24,}"; // appear at least 24 times ^[0-9A-Za-z]{24,}
                    Pattern pattern = Pattern.compile(reg);
                    Matcher matcher = pattern.matcher(str);
                    if (matcher.find()) {// matcher.matchers() {
                        String fqdnId = matcher.group();
                    }

三、一些常见的问题

1.  ^ 和 $ 他们是分别用来匹配字符串的开始和结束。(锁定模式的应用范围)

         "^wangsheng": 开头一定要有"wangsheng"的字符串才能被匹配;

    "isJoshWang$": 结尾一定要由"isJoshWang"的字符串来结尾;

那么,

  "^abc$": 就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配。

 

  "notice": 匹配包含notice的字符串。

用这个两个字符就将模式锁定在一定范围里面。

 

2. Java对反斜线的处理问题:

在其他语言中,\表示要插入一个字符;

 

在Java语言中,\表示要插入正则表达式的反斜线,并且后面的字符有特殊意义。

在Java正则表达式中,如果要插入一个字符,则需要在正则表达式中写成1) Matcher.find():尝试查找与模式匹配的字符序列的下一个子序列。此方法从字符序列的开头开始,如果该方法的前一次调用成功了并且从那时开始 匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始,即如果前一次找到与模式匹配的子序列则这次从这个子序列后开始查找。

2) Matcher.matchers():判断整个字符序列与模式是否匹配。当连续用Matcher对象检查多个字符串时候,可以使用

Matcher.reset():重置匹配器,放弃其所有显式状态信息并将其添加位置设置为零。

或者Matcher.reset(CharSequence input)  重置此具有新输入序列的匹配器来重复使用匹配器。

3) 组的概念,这个概念很重要,组是用括号划分的正则表达式,可以通过编号来引用组。组号从0开始,有几对小括号就表示有几个组,并且组可以嵌套,组号为0的表示整个表达式,组号为1的表示第一个组,依此类推。

例如:A(B)C(D)E正则式中有三组,组0是ABCDE,组1是B,组2是D;

A((B)C)(D)E正则式中有四组:组0是ABCDE,组1是BC,组2是B;组3是C,组4是D。

 int groupCount():返回匹配其模式中组的数目,不包括第0组。

String group():返回前一次匹配操作(如find())的第0组。

String group(int group):返回前一次匹配操作期间指定的组所匹配的子序列。如果该匹配成功,但指定组未能匹配字符序列的任何部分,则返回 null。

int start(int group):返回前一次匹配操作期间指定的组所匹配的子序列的初始索引。

int end(int group):返回前一次匹配操作期间指定的组所匹配的子序列的最后索引+1。

4)匹配的范围的控制

最变态的就要算lookingAt()方法了,名字很让人迷惑,需要认真看APIDoc。

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

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

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

与 matches 方法类似,此方法始终从区域的开头开始;与之不同的是,它不需要匹配整个区域。

如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。

返回:当且仅当输入序列的前缀匹配此匹配器的模式时才返回 true。

 5) Pattern标记

 Pattern类的静态方法

static Pattern compile(String regex, int flags)

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

其中的flags参数就是Pattern标记,这个标记在某些时候非常重要。

 Pattern.CANON_EQ

          启用规范等价。

Pattern.CASE_INSENSITIVE

          启用不区分大小写的匹配。

Pattern.COMMENTS

          模式中允许空白和注释。

Pattern.DOTALL

          启用 dotall 模式。

Pattern.LITERAL

          启用模式的字面值分析。

Pattern.MULTILINE

          启用多行模式。

Pattern.UNICODE_CASE

          启用 Unicode 感知的大小写折叠。

Pattern.UNIX_LINES

          启用 Unix 行模式。 

 4. 字符串的替换

String.replace(char oldChar, char newChar)

          返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的。

String.replace(CharSequence target, CharSequence replacement)

          使用指定的字面值替换序列替换此字符串匹配字面值目标序列的每个子字符串。

String.replaceAll(String regex, String replacement)

          使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的每个子字符串。

String.replaceFirst(String regex, String replacement)

          使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的第一个子字符串。

 StringBuffer.replace(int start, int end, String str)

          使用给定 String 中的字符替换此序列的子字符串中的字符。

StringBuilder.replace(int, int, java.lang.String)

          使用给定 String 中的字符替换此序列的子字符串中的字符。

 Matcher.replaceAll(String replacement)

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

Matcher.replaceFirst(String replacement)

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

5、 字符串的切分

String[] split(String regex)

          根据给定的正则表达式的匹配来拆分此字符串。

 String[] split(String regex, int limit)

          根据匹配给定的正则表达式来拆分此字符串。

当然,还有一个StringTokenizer类,可以用来切分字符串,但是现在SUN已经不推荐使用了。转变下思路,其实用正则表达式也可以达到将字符串切分为段的目的。

6. 正则表达式最大的难点在于熟练书写正则表达式:

构造                                匹配 字符 字符类 预定义字符类 POSIX 字符类(仅 US-ASCII) java.lang.Character 类(简单的 x字符x\反斜线字符n带有八进制值0的字符n(0 <= n <= 7)nn带有八进制值0的字符nn(0 <= n <= 7)mnn带有八进制值0的字符mnn(0 <= m <= 3、0 <= n <= 7)xhh带有十六进制值 0x的字符hhuhhhh带有十六进制值 0x的字符hhhht制表符 ('u0009')n新行(换行)符 ('u000A')r回车符 ('u000D')f换页符 ('u000C')a报警 (bell) 符 ('u0007')e转义符 ('u001B')cx对应于x的控制符[abc]a、b或c(简单类)[^abc]任何字符,除了a、b或c(否定)[a-zA-Z]a到z或A到Z,两头的字母包括在内(范围)[a-d[m-p]]a到d或m到p:[a-dm-p](并集)[a-z&&[def]]d、e或f(交集)[a-z&&[^bc]]a到z,除了b和c:[ad-z](减去)[a-z&&[^m-p]]a到z,而非m到p:[a-lq-z](减去).任何字符(与d数字:[0-9]D非数字:[^0-9]s空白字符:[ tnx0Bfr]S非空白字符:[^s]w单词字符:[a-zA-Z_0-9]W非单词字符:[^w]p{Lower}小写字母字符:[a-z]p{Upper}大写字母字符:[A-Z]p{ASCII}所有 ASCII:[x00-x7F]p{Alpha}字母字符:[p{Lower}p{Upper}]p{Digit}十进制数字:[0-9]p{Alnum}字母数字字符:[p{Alpha}p{Digit}]p{Punct}标点符号:!"#$%&'()*+,-./:;<=>?@[]^_`{|}~p{Graph}可见字符:[p{Alnum}p{Punct}]p{Print}可打印字符:[p{Graph}x20]p{Blank}空格或制表符:[ t]p{Cntrl}控制字符:[x00-x1Fx7F]p{XDigit}十六进制数字:[0-9a-fA-F]p{Space}空白字符:[ tnx0Bfr]p{javaLowerCase}等效于 java.lang.Character.isLowerCase()p{javaUpperCase}等效于 java.lang.Character.isUpperCase()p{javaWhitespace}等效于 java.lang.Character.isWhitespace()p{javaMirrored}等效于 java.lang.Character.isMirrored()p{InGreek}Greek 块(简单p{Lu}大写字母(简单p{Sc}货币符号P{InGreek}所有字符,Greek 块中的除外(否定)[p{L}&&[^p{Lu}]] 所有字母,大写字母除外(减去)^行的开头$行的结尾b单词边界B非单词边界A输入的开头G上一个匹配的结尾Z输入的结尾,仅用于最后的z输入的结尾X?X,一次或一次也没有X*X,零次或多次X+X,一次或多次X{n}X,恰好n次X{n,}X,至少n次X{n,m}X,至少n次,但是不超过m次X??X,一次或一次也没有X*?X,零次或多次X+?X,一次或多次X{n}?X,恰好n次X{n,}?X,至少n次X{n,m}?X,至少n次,但是不超过m次X?+X,一次或一次也没有X*+X,零次或多次X++X,一次或多次X{n}+X,恰好n次X{n,}+X,至少n次X{n,m}+X,至少n次,但是不超过m次XYX后跟YX|YX或Y(X)X,作为n任何匹配的nth Nothing,但是引用以下字符QNothing,但是引用所有字符,直到EENothing,但是结束从Q开始的引用(?:X)X,作为非捕获组(?idmsux-idmsux) Nothing,但是将匹配标志dsx on - off(?idmsux-idmsux:X)  X,作为带有给定标志dsx on - off(?=X)X,通过零宽度的正 lookahead(?!X)X,通过零宽度的负 lookahead(?<=X)X,通过零宽度的正 lookbehind(?<!X)X,通过零宽度的负 lookbehind(?>X)X,作为独立的非捕获组

反斜线字符 ('') 用于引用转义构造,如上表所定义的,同时还用于引用其他将被解释为非转义构造的字符。因此,表达式 \与单个反斜线匹配,而{与左括号匹配。

在不表示转义构造的任何字母字符前使用反斜线都是错误的;它们是为将来扩展正则表达式语言保留的。可以在非字母字符前使用反斜线,不管该字符是否非转义构造的一部分。

Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "b"与单个退格字符匹配,而"\b"与单词边界匹配。字符串字面值"(hello)"是非法的,将导致编译时错误;要与字符串(hello)匹配,必须使用字符串字面值"hello "。 字符类可以出现在其他字符类中,并且可以包含并集运算符(隐式)和交集运算符 (&&)。并集运算符表示至少包含其某个操作数类中所有字符的类。交集运算符表示包含同时位于其两个操作数类中所有字符的类。

字符类运算符的优先级如下所示,按从最高到最低的顺序排列:

1     2     3     4     5     字面值转义    

x

分组

[...]

范围

a-z

并集

[a-e][i-u]

交集

[a-z&&[aeiou]]

 

行结束符是一个或两个字符的序列,标记输入字符序列的行结尾。以下代码被识别为行结束符:

 

  • 新行(换行)符 ('n')、
  • 后面紧跟新行符的回车符 ("rn")、
  • 单独的回车符 ('r')、
  • 下一行字符 ('u0085')、
  • 行分隔符 ('u2028') 或
  • 段落分隔符 ('u2029)。

如果未指定DOTALL标志,则正则表达式.可以与任何字符(行结束符除外)匹配。

默认情况下,正则表达式^和$忽略行结束符,仅分别与整个输入序列的开头和结尾匹配。如果激活MULTILINE模式,则^在输入的开头和行结束符之后(输入的结尾)才发生匹配。处于MULTILINE模式中时,$仅在行结束符之前或输入序列的结尾处匹配。 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式((A)(B(C)))中,存在四个这样的组:

1     2     3     4     ((A)(B(C)))

A

(B(C))

(C)

组零始终代表整个表达式。

之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器获取。

与组关联的捕获输入始终是与组最近匹配的子序列。如果由于量化的缘故再次计算了组,则在第二次计算失败时将保留其以前捕获的值(如果有的话)例如,将字符串"aba"与表达式(a(b)?)+相匹配,会将第二组设置为"b"。在每个匹配的开头,所有捕获的输入都会被丢弃。

以(?)开头的组是纯的非捕获组,它不捕获文本,也不针对组合计进行计数。

Unicode Technical Standard #18:Unicode Regular Expression Guidelines 第 1 级和 RL2.1 Canonical Equivalents。

Java 源代码中的 Unicode 转义序列(如 u2014)是按照 Java Language Specification 的 

prop,则与p{prop}匹配,而输入具有该属性时与P{prop}不匹配。块使用前缀In指定,与在InMongolian中一样。可以使用可选前缀Is指定类别:p{L}和p{IsL} 都表示 Unicode 字母的类别。块和类别在字符类的内部和外部都可以使用。

The Unicode Standard 的类别。类别名称是在 Standard 中定义的,即标准又丰富。

methodname方法(废弃的类别除外)的类别,可以通过相同的p{prop}语法来提供,其中指定的属性具有名称javamethodname。

此类不支持 Perl 构造:

 

  • 条件构造(?{X})和(?(condition)X|Y)、
  • 嵌入式代码构造(?{code})和(??{code})、
  • 嵌入式注释语法(?#comment)和
  • 预处理操作lu、L和U。

此类支持但 Perl 不支持的构造:

  • Possessive 数量词,它可以尽可能多地进行匹配,即使这样做导致所有匹配都成功时也如此。
  • 上文所述。  

与 Perl 的显著不同点是:

  • 在 Perl 中,1到9 始终被解释为 Back 引用;如果至少存在多个子表达式,则大于 9 的反斜线转义数按 Back 引用对待,否则在可能的情况下,它将被解释为八进制转义。在此类中,八进制转义必须始终以零开头。在此类中,1到9 始终被解释为 Back 引用,较大的数被接受为 Back 引用,如果在正则表达式中至少存在多个子表达式的话;否则,解析器将删除数字,直到该数小于等于组的现有数或者其为一个数字。
  • Perl 使用 g标志请求恢复最后匹配丢失的匹配。此功能是由Matcher类显式提供的:重复执行find方法调用可以恢复丢失的最后匹配,除非匹配器被重置。
  • 在 Perl 中,位于表达式顶级的嵌入式标记对整个表达式都有影响。在此类中,嵌入式标志始终在它们出现的时候才起作用,不管它们位于顶级还是组中;在后一种情况下,与在 Perl 中类似,标志在组的结尾处还原。
  • Perl 允许错误匹配构造,如在表达式 *a中,以及不匹配的括号,如在在表达式abc] 中,并将其作为字面值对待。此类还接受不匹配的括号,但对 +、? 和 * 不匹配元字符有严格限制;如果遇到它们,则抛出PatternSyntaxException

匹配中文:[\u4e00-\u9fa5] 

英文字母:[a-zA-Z] 

数字:[0-9] 


匹配中文,英文字母和数字及_: 

^[\u4e00-\u9fa5_a-zA-Z0-9]+$


同时判断输入长度:

[\u4e00-\u9fa5_a-zA-Z0-9_]{4,10}

 ^[\w\u4E00-\u9FA5\uF900-\uFA2D]*$ 1、一个正则表达式,只含有汉字、数字、字母、下划线不能以下划线开头和结尾:
 ^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$  其中:
 ^  与字符串开始的地方匹配
 (?!_)  不能以_开头
 (?!.*?_$)  不能以_结尾
 [a-zA-Z0-9_\u4e00-\u9fa5]+  至少一个汉字、数字、字母、下划线
 $  与字符串结束的地方匹配


放在程序里前面加@,否则需要\\进行转义 @"^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$"

(或者:@"^(?!_)\w*(?<!_)$"    或者  @" ^[\u4E00-\u9FA50-9a-zA-Z_]+$ "  )


2、只含有汉字、数字、字母、下划线,下划线位置不限:

^[a-zA-Z0-9_\u4e00-\u9fa5]+$


3、由数字、26个英文字母或者下划线组成的字符串

^\w+$


4、2~4个汉字

@"^[\u4E00-\u9FA5]{2,4}$"; 


5、

^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$


用:(Abc)+    来分析:  XYZAbcAbcAbcXYZAbcAb

XYZAbcAbcAbcXYZAbcAb6、
 [^\u4E00-\u9FA50-9a-zA-Z_]
 34555#5' -->34555#5'

 [\u4E00-\u9FA50-9a-zA-Z_]    eiieng_89_   --->   eiieng_89_
 _';'eiieng_88&*9_    -->  _';'eiieng_88&*9_
 _';'eiieng_88_&*9_  -->  _';'eiieng_88_&*9_


public  bool RegexName(string str)
 {
 bool flag=Regex.IsMatch(str,@"^[a-zA-Z0-9_\u4e00-\u9fa5]+$");
 return  flag;
 }

 Regex   reg=new   Regex("^[a-zA-Z_0-9]+$");   
 if(reg.IsMatch(s))   
 {   
 \\符合规则   
 }   
 else   
 {   
 \\存在非法字符   
 }


最长不得超过7个汉字,或14个字节(数字,字母和下划线)正则表达式

^[\u4e00-\u9fa5]{1,7}$|^[\dA-Za-z_]{1,14}$


常用正则表达式大全!(例如:匹配中文、匹配html)

匹配中文字符的正则表达式: [u4e00-u9fa5]   

评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 

匹配双字节字符(包括汉字在内):[^x00-xff] 

评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 

匹配空白行的正则表达式:ns*r 

评注:可以用来删除空白行 

匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? /> 

评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力 

匹配首尾空白字符的正则表达式:^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个英文字母或者下划线组成的字符串 

在使用RegularExpressionValidator验证控件时的验证功能及其验证表达式介绍如下: 

只能输入数字:“^[0-9]*$” 

只能输入n位的数字:“^d{n}$” 

只能输入至少n位数字:“^d{n,}$” 

只能输入m-n位的数字:“^d{m,n}$” 

只能输入零和非零开头的数字:“^(0|[1-9][0-9]*)$” 

只能输入有两位小数的正实数:“^[0-9]+(.[0-9]{2})?$” 

只能输入有1-3位小数的正实数:“^[0-9]+(.[0-9]{1,3})?$” 

只能输入非零的正整数:“^+?[1-9][0-9]*$” 

只能输入非零的负整数:“^-[1-9][0-9]*$” 

只能输入长度为3的字符:“^.{3}$” 

只能输入由26个英文字母组成的字符串:“^[A-Za-z]+$” 

只能输入由26个大写英文字母组成的字符串:“^[A-Z]+$” 

只能输入由26个小写英文字母组成的字符串:“^[a-z]+$” 

只能输入由数字和26个英文字母组成的字符串:“^[A-Za-z0-9]+$” 

只能输入由数字、26个英文字母或者下划线组成的字符串:“^w+$” 

验证用户密码:“^[a-zA-Z]w{5,17}$”正确格式为:以字母开头,长度在6-18之间, 

只能包含字符、数字和下划线。 

验证是否含有^%&',;=?$"等字符:“[^%&',;=?$x22]+” 

只能输入汉字:“^[u4e00-u9fa5],{0,}$” 

验证Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$” 

验证InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$” 

验证电话号码:“^((d{3,4})|d{3,4}-)?d{7,8}$” 

正确格式为:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”, 

“XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。 

验证身份证号(15位或18位数字):“^d{15}|d{}18$” 

验证一年的12个月:“^(0?[1-9]|1[0-2])$”正确格式为:“01”-“09”和“1”“12” 

验证一个月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$” 

正确格式为:“01”“09”和“1”“31”。 

匹配中文字符的正则表达式: [u4e00-u9fa5] 

匹配双字节字符(包括汉字在内):[^x00-xff] 

匹配空行的正则表达式:n[s| ]*r 

匹配HTML标记的正则表达式:/<(.*)>.*|<(.*) />/ 

匹配首尾空格的正则表达式:(^s*)|(s*$) 

匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 

匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)? 

(1)应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 

String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;} 

(2)应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现 

String.prototype.trim = function() 
 { 
 return this.replace(/(^s*)|(s*$)/g, ""); 
 }

(3)应用:利用正则表达式分解和转换IP地址 

function IP2V(ip) //IP地址转换成对应数值 
 { 
 re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式 
 if(re.test(ip)) 
 { 
 return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1 
 } 
 else 
 { 
 throw new Error("Not a valid IP address!") 
 } 
 }

(4)应用:从URL地址中提取文件名的javascript程序 

s="http://www.juapk.com/forum.php"; 
 s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2") ;//Page1.htm

(5)应用:利用正则表达式限制网页表单里的文本框输入内容 

用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,'))" 

用正则表达式限制只能输入全角字符:onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,'))" 

用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^d]/g,') "onbeforepaste= "clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,'))" 

用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[W]/g,') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,'

 简单例子

public static void main(String[] args) {
String patternStr = "\u300a.+\u300b";
Pattern pattern = Pattern.compile(patternStr);
String input = "《21世纪》记者";
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
int start = matcher.start();
int end = matcher.end();
System.out.println(input.substring(start, end));
}else{
System.out.println("not found");
}
//output: 《21世纪》
}


1.java验证IP地址:

Pattern pattern = Pattern.compile(“\\b((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\b”);
Matcher matcher = pattern.matcher(“127.400.600.2″); //以验证127.400.600.2为例
System.out.println(matcher.matches());

2. java验证日期时间,解决润月:

Pattern pattern = Pattern.compile(“^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$”);
Matcher matcher = pattern.matcher(“2000-02-29 23:59:59″);
System.out.println(matcher.matches());

 

3.java验证邮箱格式:

Pattern pattern = Pattern.compile(“^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$”);
Matcher matcher = pattern.matcher(“a@aa.com”);
System.out.println(matcher.matches());

 

正则表达式的贪婪模式

 非贪婪模式是指尽可能少的查找满足匹配的结果,一般情况下我们使用都是非贪婪模式。使用贪婪模式的话,需要加上(*?);这个就是贪婪模式的开始。比如下面的匹配:

String pattern = "<a>(.*)</a>";    非贪婪
<a>hello<a>world</a>welcome</a>
  String pattern = "<a>(.*?)</a>"; 贪婪
<a>hello<a>   和  </a>welcome</a>