jsp 脚本下面的正则表达式是什么意思 
<script language="javascript">
if(!(/^(\+|-)?\d+($|\.\d+$)/.test( home )) )

解决方案 »

  1.   

    判断home是不是数字,这种数字可以是正,负, 整数,浮点数
      

  2.   

    正则表达式入门 
    众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段。 
    大家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 
      自从jdk1.4推出java.util.regex包,就为我们提供了很好的JAVA正则表达式应用平台。 因为正则表达式是一个很庞杂的体系,所以我仅例举些入门的概念,更多的请参阅相关书籍及自行摸索。 \\ 反斜杠 
    \t 间隔 ('\u0009') 
    \n 换行 ('\u000A') 
    \r 回车 ('\u000D') 
    \d 数字 等价于[0-9] 
    \D 非数字 等价于[^0-9] 
    \s 空白符号 [\t\n\x0B\f\r] 
    \S 非空白符号 [^\t\n\x0B\f\r] 
    \w 单独字符 [a-zA-Z_0-9] 
    \W 非单独字符 [^a-zA-Z_0-9] 
    \f 换页符 
    \e Escape 
    \b 一个单词的边界 
    \B 一个非单词的边界 
    \G 前一个匹配的结束 ^为限制开头 
    ^java     条件限制为以Java为开头字符 
    $为限制结尾 
    java$     条件限制为以java为结尾字符 
    .  条件限制除\n以外任意一个单独字符 
    java..     条件限制为java后除换行外任意两个字符 
    加入特定限制条件「[]」 
    [a-z]     条件限制在小写a to z范围中一个字符 
    [A-Z]     条件限制在大写A to Z范围中一个字符 
    [a-zA-Z] 条件限制在小写a to z或大写A to Z范围中一个字符 
    [0-9]     条件限制在小写0 to 9范围中一个字符 
    [0-9a-z] 条件限制在小写0 to 9或a to z范围中一个字符 
    [0-9[a-z]] 条件限制在小写0 to 9或a to z范围中一个字符(交集) []中加入^后加再次限制条件「[^]」 
    [^a-z]     条件限制在非小写a to z范围中一个字符 
    [^A-Z]     条件限制在非大写A to Z范围中一个字符 
    [^a-zA-Z] 条件限制在非小写a to z或大写A to Z范围中一个字符 
    [^0-9]     条件限制在非小写0 to 9范围中一个字符 
    [^0-9a-z] 条件限制在非小写0 to 9或a to z范围中一个字符 
    [^0-9[a-z]] 条件限制在非小写0 to 9或a to z范围中一个字符(交集) 在限制条件为特定字符出现0次以上时,可以使用「*」 
    J*     0个以上J 
    .*     0个以上任意字符 
    J.*D     J与D之间0个以上任意字符 在限制条件为特定字符出现1次以上时,可以使用「+」 
    J+     1个以上J 
    .+     1个以上任意字符 
    J.+D     J与D之间1个以上任意字符 在限制条件为特定字符出现有0或1次以上时,可以使用「?」 
    JA?     J或者JA出现 限制为连续出现指定次数字符「{a}」 
    J{2}     JJ 
    J{3}     JJJ 
    文字a个以上,并且「{a,}」 
    J{3,}     JJJ,JJJJ,JJJJJ,???(3次以上J并存) 
    文字个以上,b个以下「{a,b}」 
    J{3,5}     JJJ或JJJJ或JJJJJ 
    两者取一「|」 
    J|A     J或A 
    Java|Hello     Java或Hello 「()」中规定一个组合类型 
    比如,我查询<a href=\"index.html\">index</a>中<a href></a>间的数据,可写作<a.*href=\".*\">(.+?)</a> 在使用Pattern.compile函数时,可以加入控制正则表达式的匹配行为的参数: 
    Pattern Pattern.compile(String regex, int flag) flag的取值范围如下: 
    Pattern.CANON_EQ     当且仅当两个字符的"正规分解(canonical decomposition)"都完全相同的情况下,才认定匹配。比如用了这个标志之后,表达式"a\u030A"会匹配"?"。默认情况下,不考虑"规范相等性(canonical equivalence)"。 
    Pattern.CASE_INSENSITIVE(?i)     默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。这个标志能让表达式忽略大小写进行匹配。要想对Unicode字符进行大小不明感的匹配,只要将UNICODE_CASE与这个标志合起来就行了。 
    Pattern.COMMENTS(?x)     在这种模式下,匹配时会忽略(正则表达式里的)空格字符(译者注:不是指表达式里的"\\s",而是指表达式里的空格,tab,回车之类)。注释从#开始,一直到这行结束。可以通过嵌入式的标志来启用Unix行模式。 
    Pattern.DOTALL(?s)     在这种模式下,表达式'.'可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式'.'不匹配行的结束符。 
    Pattern.MULTILINE 
    (?m)     在这种模式下,'^'和'$'分别匹配一行的开始和结束。此外,'^'仍然匹配字符串的开始,'$'也匹配字符串的结束。默认情况下,这两个表达式仅仅匹配字符串的开始和结束。 
    Pattern.UNICODE_CASE 
    (?u)     在这个模式下,如果你还启用了CASE_INSENSITIVE标志,那么它会对Unicode字符进行大小写不明感的匹配。默认情况下,大小写不敏感的匹配只适用于US-ASCII字符集。 
    Pattern.UNIX_LINES(?d)     在这个模式下,只有'\n'才被认作一行的中止,并且与'.','^',以及'$'进行匹配。 
    抛开空泛的概念,下面写出几个简单的Java正则用例: ◆比如,在字符串包含验证时 //查找以Java开头,任意结尾的字符串 
      Pattern pattern = Pattern.compile("^Java.*"); 
      Matcher matcher = pattern.matcher("Java不是人"); 
      boolean b= matcher.matches(); 
      //当条件满足时,将返回true,否则返回false 
      System.out.println(b); 
    ◆以多条件分割字符串时 
    Pattern pattern = Pattern.compile("[, |]+"); 
    String[] strs = pattern.split("Java Hello World  Java,Hello,,World|Sun"); 
    for (int i=0;i<strs.length;i++) { 
        System.out.println(strs[i]); 
    } ◆文字替换(首次出现字符) 
    Pattern pattern = Pattern.compile("正则表达式"); 
    Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World"); 
    //替换第一个符合正则的数据 
    System.out.println(matcher.replaceFirst("Java")); ◆文字替换(全部) 
    Pattern pattern = Pattern.compile("正则表达式"); 
    Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World"); 
    //替换第一个符合正则的数据 
    System.out.println(matcher.replaceAll("Java")); 
    ◆文字替换(置换字符) 
    Pattern pattern = Pattern.compile("正则表达式"); 
    Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World "); 
    StringBuffer sbr = new StringBuffer(); 
    while (matcher.find()) { 
        matcher.appendReplacement(sbr, "Java"); 

    matcher.appendTail(sbr); 
    System.out.println(sbr.toString()); ◆验证是否为邮箱地址 String str="[email protected]"; 
    Pattern pattern = Pattern.compile("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+",Pattern.CASE_INSENSITIVE); 
    Matcher matcher = pattern.matcher(str); 
    System.out.println(matcher.matches()); ◆去除html标记 
    Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL); 
    Matcher matcher = pattern.matcher("<a href=\"index.html\">主页</a>"); 
    String string = matcher.replaceAll(""); 
    System.out.println(string); ◆查找html中对应条件字符串 
    Pattern pattern = Pattern.compile("href=\"(.+?)\""); 
    Matcher matcher = pattern.matcher("<a href=\"index.html\">主页</a>"); 
    if(matcher.find()) 
      System.out.println(matcher.group(1)); 
    } ◆截取http://地址 
    //截取url 
    Pattern pattern = Pattern.compile("(http://|https://){1}[\\w\\.\\-/:]+"); 
    Matcher matcher = pattern.matcher("dsdsds<http://dsds//gfgffdfd>fdf"); 
    StringBuffer buffer = new StringBuffer(); 
    while(matcher.find()){              
        buffer.append(matcher.group());        
        buffer.append("\r\n");              
    System.out.println(buffer.toString()); 

            
    ◆替换指定{}中文字 String str = "Java目前的发展史是由{0}年-{1}年"; 
    String[][] object={new String[]{"\\{0\\}","1995"},new String[]{"\\{1\\}","2007"}}; 
    System.out.println(replace(str,object)); public static String replace(final String sourceString,Object[] object) { 
                String temp=sourceString;    
                for(int i=0;i<object.length;i++){ 
                          String[] result=(String[])object[i]; 
                   Pattern    pattern = Pattern.compile(result[0]); 
                   Matcher matcher = pattern.matcher(temp); 
                   temp=matcher.replaceAll(result[1]); 
                } 
                return temp; 

    ◆以正则条件查询指定目录下文件 //用于缓存文件列表 
            private ArrayList files = new ArrayList(); 
            //用于承载文件路径 
            private String _path; 
            //用于承载未合并的正则公式 
            private String _regexp; 
            
            class MyFileFilter implements FileFilter {               /** 
                   * 匹配文件名称 
                   */ 
                  public boolean accept(File file) { 
                    try { 
                      Pattern pattern = Pattern.compile(_regexp); 
                      Matcher match = pattern.matcher(file.getName());                
                      return match.matches(); 
                    } catch (Exception e) { 
                      return true; 
                    } 
                  } 
                } 
            
            /** 
             * 解析输入流 
             * @param inputs 
             */ 
            FilesAnalyze (String path,String regexp){ 
                getFileName(path,regexp); 
            } 
            
            /** 
             * 分析文件名并加入files 
             * @param input 
             */ 
            private void getFileName(String path,String regexp) { 
                //目录 
                  _path=path; 
                  _regexp=regexp; 
                  File directory = new File(_path); 
                  File[] filesFile = directory.listFiles(new MyFileFilter()); 
                  if (filesFile == null) return; 
                  for (int j = 0; j < filesFile.length; j++) { 
                    files.add(filesFile[j]); 
                  } 
                  return; 
                } 
        
            /** 
             * 显示输出信息 
             * @param out 
             */ 
            public void print (PrintStream out) { 
                Iterator elements = files.iterator(); 
                while (elements.hasNext()) { 
                    File file=(File) elements.next(); 
                        out.println(file.getPath());    
                } 
            }         public static void output(String path,String regexp) {             FilesAnalyze fileGroup1 = new FilesAnalyze(path,regexp); 
                fileGroup1.print(System.out); 
            } 
        
            public static void main (String[] args) { 
                output("C:\\","[A-z|.]*"); 
            } 
      

  3.   

            // 初步认识. * + ?   
            // Reluctant 数量词   
            // X?? X,一次或一次也没有   
            // X*? X,零次或多次   
            // X+? X,一次或多次   
            // X{n}? X,恰好 n 次   
            // X{n,}? X,至少 n 次   
            // X{n,m}? X,至少 n 次,但是不超过 m 次   
            System.out.println("+++++++++++++++++++++++++++++++++++++");   
            p("a".matches("."));// p()为打印函数,见最后   
            p("aa".matches("aa"));   
            p("aaaa".matches("a*"));   
            p("aaaa".matches("a+"));   
            p("".matches("a*"));   
            p("aaaa".matches("a?"));   
            p("".matches("a?"));   
            p("a".matches("a?"));   
            p("214523145234532".matches("\\d{3,100}"));   
            p("192.168.0.aaa".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));   
            p("192".matches("[0-2][0-9][0-9]"));   
            // 上面\\.就是表示.   
      
            // 范围   
            // 字符类   
            // [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](减去)   
            System.out.println("+++++++++++++++++++++++++++++++++++++");   
            p("a".matches("[abc]"));   
            p("a".matches("[^abc]"));   
            p("A".matches("[a-zA-Z]"));   
            p("A".matches("[a-z]|[A-Z]"));   
            p("A".matches("[a-z[A-Z]]"));   
            p("R".matches("[A-Z&&[RFG]]"));   
      
            // 认识\s \w \d \   
            // 预定义字符类   
            // . 任何字符(与行结束符可能匹配也可能不匹配)   
            // \d 数字:[0-9]   
            // \D 非数字: [^0-9]   
            // \s 空白字符:[ \t\n\x0B\f\r]   
            // \S 非空白字符:[^\s]   
            // \w 单词字符:[a-zA-Z_0-9]   
            // \W 非单词字符:[^\w]   
      
            System.out.println("+++++++++++++++++++++++++++++++++++++");   
            p(" \n\r\t".matches("\\s{4}"));   
            p(" ".matches("\\S"));   
            p("a_8".matches("\\w{3}"));   
            p("abc888&^%".matches("[a-z]{1,3}\\d+[&^#%]+"));   
            p("\\".matches("\\\\"));// 在java中\需要用转义字符\\表示,此处要匹配一个\,需要用\\\\的模式来匹配。   
      
            // POSIX 字符类(仅 US-ASCII) POSIX 来匹配的写法,用的不多   
            // \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-\x1F\x7F]   
            // \p{XDigit} 十六进制数字:[0-9a-fA-F]   
            // \p{Space} 空白字符:[ \t\n\x0B\f\r]   
            System.out.println("+++++++++++++++++++++++++++++++++++++");   
            // POSIX Style   
            p("a".matches("\\p{Lower}"));   
      
            // 边界匹配器   
            // ^ 行的开头   
            // $ 行的结尾   
            // \b 单词边界   
            // \B 非单词边界   
            // \A 输入的开头   
            // \G 上一个匹配的结尾   
            // \Z 输入的结尾,仅用于最后的结束符(如果有的话)   
            // \z 输入的结尾   
      
            // boundary 边界匹配   
            System.out.println("+++++++++++++++++++++++++++++++++++++");   
            p("hello sir".matches("^h.*"));   
            p("hello sir".matches(".*ir$"));   
            p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));   
            p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));   
      
            // whilte lines 空白行   
            System.out.println("+++++++++++++++++++++++++++++++++++++");   
            p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));   
      
            // email地址   
            System.out.println("+++++++++++++++++++++++++++++++++++++");   
            p("[email protected]".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+"));   
      
            // matches find lookingAt   
            System.out.println("+++++++++++++++++++++++++++++++++++++");   
            Pattern p2 = Pattern.compile("\\d{3,5}");   
            String s = "123-34345-234-00";   
            Matcher m2 = p2.matcher(s);   
            p(m2.matches());// 匹配整个   
            m2.reset();   
            p(m2.find());// 发现有没有匹配的字符,并截取   
            p(m2.start() + "-" + m.end());// 相匹配的起始位置和结束位置(必须能找到情况下)   
            p(m2.find());   
            p(m2.start() + "-" + m.end());   
            p(m2.find());   
            p(m2.start() + "-" + m.end());   
            p(m2.find());   
            // p(m2.start() + "-" + m.end());   
            p(m2.lookingAt());// 发现有没有匹配的字符,不截取   
            p(m2.lookingAt());   
            p(m2.lookingAt());   
            p(m2.lookingAt());   
      
            // replacement   
            System.out.println("+++++++++++++++++++++++++++++++++++++");   
            Pattern p3 = Pattern.compile("java", Pattern.CASE_INSENSITIVE);// 忽略大小写Pattern.CASE_INSENSITIVE   
            Matcher m3 = p3   
                    .matcher("java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");   
            StringBuffer buf = new StringBuffer();   
            int i = 0;   
            while (m3.find()) {   
                i++;   
                if (i % 2 == 0) {// 偶数位置java替换成小写   
                    m3.appendReplacement(buf, "java");   
                } else {// 偶数位置java替换成大写   
                    m3.appendReplacement(buf, "JAVA");   
                }   
            }   
            // 加上尾巴   
            m3.appendTail(buf);   
            p(buf);   
      
            // group   
            System.out.println("+++++++++++++++++++++++++++++++++++++");   
            Pattern p4 = Pattern.compile("(\\d{3,5})([a-z]{2})");   
            String s4 = "123aa-34345bb-234cc-00";   
            Matcher m4 = p4.matcher(s4);   
            while (m.find()) {   
                p(m4.group(1));   
            }// p(m4.group(1));将打印第一个小括号匹配的模式结果   
            // 为123 34345 234   
            // p(m4.group(2));将打印第一个小括号匹配的模式结果为aa bb cc   
            // p(m4.group());将打印总的模式结果为123aa 34345bb 234cc   
      
            // 以下三种情况(了解即可),不多用!   
            // Greedy 数量词 (贪婪的))   
            // X? X,一次或一次也没有   
            // X* X,零次或多次   
            // X+ X,一次或多次   
            // X{n} X,恰好 n 次   
            // X{n,} X,至少 n 次   
            // X{n,m} X,至少 n 次,但是不超过 m 次   
            //            
            // Reluctant 数量词 (不情愿的)   
            // X?? X,一次或一次也没有   
            // X*? X,零次或多次   
            // X+? X,一次或多次   
            // X{n}? X,恰好 n 次   
            // X{n,}? X,至少 n 次   
            // X{n,m}? X,至少 n 次,但是不超过 m 次   
            //            
            // Possessive 数量词 (独占的)   
            // X?+ X,一次或一次也没有   
            // X*+ X,零次或多次   
            // X++ X,一次或多次   
            // X{n}+ X,恰好 n 次   
            // X{n,}+ X,至少 n 次   
            // X{n,m}+ X,至少 n 次,但是不超过 m 次   
      
            // 使用Greedy 数量词 (贪婪的))(以下3-10个的话,它会先去匹配10,匹配不上依次减少,一匹配上就结束)   
            System.out.println("+++++++++++++++++++++++++++++++++++++");   
            Pattern p6 = Pattern.compile(".{3,10}[0-9]");   
            String s6 = "aaaa5bbbb68";   
            Matcher m6 = p6.matcher(s6);   
            if (m6.find())   
                p(m6.start() + "-" + m6.end());   
            else  
                p("not match!");   
      
            // 使用 Reluctant 数量词 (不情愿的)(以下3-10个的话,它会先去匹配3,匹配不上依次增加,一匹配上就结束 )   
            Pattern p7 = Pattern.compile(".{3,10}?[0-9]");   
            String s7 = "aaaa5bbbb68";   
            Matcher m7 = p7.matcher(s7);   
            if (m7.find())   
                p(m7.start() + "-" + m7.end());   
            else  
                p("not match!");   
      
            System.out.println("+++++++++++++++++++++++++++++++++++++");   
            // 使用 Possessive 数量词(了解即可)   
            // (独占的)(以下3-10个的话,它会先去匹配10,匹配不上就把这十个先删掉再匹配下一个10个,一匹配上就结束)   
            Pattern p8 = Pattern.compile(".{3,10}?[0-9]");   
            String s8 = "aaaa5bbbb68";   
            Matcher m8 = p8.matcher(s8);   
            if (m8.find())   
                p(m8.start() + "-" + m8.end());   
            else  
                p("not match!");   
      
            // non-capturing groups(非捕获)下文.{3}(?=a)表示以a结尾的三个数字(了解即可)   
            System.out.println("+++++++++++++++++++++++++++++++++++++");   
            Pattern p9 = Pattern.compile(".{3}(?=a)");   
            String s9 = "444a66b";   
            Matcher m9 = p9.matcher(s9);   
            while (m9.find()) {   
                p(m9.group());   
            }   
      
            // back refenrences   
            // 匹配的后的两个组需要一样(了解即可)   
            System.out.println("+++++++++++++++++++++++++++++++++++++");   
            Pattern p10 = Pattern.compile("(\\d\\d)\\1");   
            String s10 = "1212";   
            Matcher m10 = p10.matcher(s10);   
            p(m10.matches());   
      
            // flags的简写   
            // Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);   
            // 上面的句子简写(了解即可)   
            System.out.println("+++++++++++++++++++++++++++++++++++++");   
            p("Java".matches("(?i)(java)"));   
        }   
      
        public static void p(Object o) {   
            System.out.println(o);   
        }   
      
    }  
    2、email抓取 import java.io.BufferedReader;   
    import java.io.FileNotFoundException;   
    import java.io.FileReader;   
    import java.io.IOException;   
    import java.util.regex.Matcher;   
    import java.util.regex.Pattern;   
      
      
    public class EmailSpider {   
      
        public static void main(String[] args) {   
            try {   
                BufferedReader br = new BufferedReader(new FileReader("D:\\含邮件地址的.html"));   
                String line = "";   
                while((line=br.readLine()) != null) {   
                    parse(line);   
                }   
            } catch (FileNotFoundException e) {   
                // TODO Auto-generated catch block   
                e.printStackTrace();   
            } catch (IOException e) {   
                // TODO Auto-generated catch block   
                e.printStackTrace();   
            }   
        }   
      
        private static void parse(String line) {   
            Pattern p = Pattern.compile("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+");   
            Matcher m = p.matcher(line);   
            while(m.find()) {   
                System.out.println(m.group());   
            }   
        }   
      

      

  4.   

    鄙视LS,贴这么多不如给个链接,又没解决问题:开头的^匹配一句的开头,结尾的$匹配一句结束。(\+|-)?——其中\+匹配"+"号,但因为+在正则表达式中有特殊含义,因此要用\+。?是0个或1个的意思,所以合起来就是判断前面有没有正负号。\d+——其中\d指数字,+为1个或多个,所以意为小数点前的若干数字。$|\.\d+$——第二个字符|是选择分支,前面的$直接匹配句子结束,即没有小数。
    后面的\.,“.”在正则中也是有特殊含义的,所以还要用\,用来匹配小数点。再后面的\d+显然就是若干小数了总结:整个正则表达式就是用来匹配数字的。但考虑仍不周全,不能匹配“-.38”这种小数。