初学正则表达式,求助高手!
怎样将一段html中的a标签提取出来,并且将href和topic以分组形式提取出来?(用正则表达式)

解决方案 »

  1.   

        很简单,自己好好想想(下面有些资料):
    正则表达式的构造摘要
    构造  匹配
     
    字符
    x  字符 x
    \\  反斜线字符
    \0n  带有八进制值 0 的字符 n (0 <= n <= 7)
    \0nn  带有八进制值 0 的字符 nn (0 <= n <= 7)
    \0mnn  带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
    \xhh  带有十六进制值 0x 的字符 hh
    \uhhhh  带有十六进制值 0x 的字符 hhhh
    \t  制表符 ('\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  空白字符:[ \t\n\x0B\f\r]
    \S  非空白字符:[^\s]
    \w  单词字符:[a-zA-Z_0-9]
    \W  非单词字符:[^\w]
     
    POSIX 字符类(仅 US-ASCII)
    \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]
     
    java.lang.Character 类(简单的 java 字符类型)
    \p{javaLowerCase}  等效于 java.lang.Character.isLowerCase()
    \p{javaUpperCase}  等效于 java.lang.Character.isUpperCase()
    \p{javaWhitespace}  等效于 java.lang.Character.isWhitespace()
    \p{javaMirrored}  等效于 java.lang.Character.isMirrored()
     
    Unicode 块和类别的类
    \p{InGreek}  Greek 块(简单块)中的字符
    \p{Lu}  大写字母(简单类别)
    \p{Sc}  货币符号
    \P{InGreek}  所有字符,Greek 块中的除外(否定)
    [\p{L}&&[^\p{Lu}]]   所有字母,大写字母除外(减去)
     
    边界匹配器
    ^  行的开头
    $  行的结尾
    \b  单词边界
    \B  非单词边界
    \A  输入的开头
    \G  上一个匹配的结尾
    \Z  输入的结尾,仅用于最后的结束符(如果有的话)
    \z  输入的结尾
     
    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 次
     
    Logical 运算符
    XY  X 后跟 Y
    X|Y  X 或 Y
    (X)  X,作为捕获组
     
    Back 引用
    \n  任何匹配的 nth 捕获组
     
    引用
    \  Nothing,但是引用以下字符
    \Q  Nothing,但是引用所有字符,直到 \E
    \E  Nothing,但是结束从 \Q 开始的引用
     
    特殊构造(非捕获)
    (?:X)  X,作为非捕获组
    (?idmsux-idmsux)   Nothing,但是将匹配标志由 on 转为 off
    (?idmsux-idmsux:X)    X,作为带有给定标志 on - off 的非捕获组
    (?=X)  X,通过零宽度的正 lookahead
    (?!X)  X,通过零宽度的负 lookahead
    (?<=X)  X,通过零宽度的正 lookbehind
    (?<!X)  X,通过零宽度的负 lookbehind
    (?>X)  X,作为独立的非捕获组
    反斜线、转义和引用反斜线字符 ('\') 用于引用转义构造,如上表所定义的,同时还用于引用其他将被解释为非转义构造的字符。因此,表达式 \\ 与单个反斜线匹配,而 \{ 与左括号匹配。在不表示转义构造的任何字母字符前使用反斜线都是错误的;它们是为将来扩展正则表达式语言保留的。可以在非字母字符前使用反斜线,不管该字符是否非转义构造的一部分。根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "\b" 与单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "\(hello\)" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 "\\(hello\\)"。
    字符类字符类可以出现在其他字符类中,并且可以包含并集运算符(隐式)和交集运算符 (&&)。并集运算符表示至少包含其某个操作数类中所有字符的类。交集运算符表示包含同时位于其两个操作数类中所有字符的类。字符类运算符的优先级如下所示,按从最高到最低的顺序排列:    1      字面值转义      \x
        2      分组  [...]
        3      范围  a-z
        4      并集  [a-e][i-u]
        5      交集  [a-z&&[aeiou]]注意,元字符的不同集合实际上位于字符类的内部,而非字符类的外部。例如,正则表达式 . 在字符类内部就失去了其特殊意义,而表达式 - 变成了形成元字符的范围。
    行结束符行结束符 是一个或两个字符的序列,标记输入字符序列的行结尾。以下代码被识别为行结束符:    * 新行(换行)符 ('\n')、
        * 后面紧跟新行符的回车符 ("\r\n")、
        * 单独的回车符 ('\r')、
        * 下一行字符 ('\u0085')、
        * 行分隔符 ('\u2028') 或
        * 段落分隔符 ('\u2029)。 
      

  2.   

    Pattern p = Pattern.compile("<a\\s+href=\"([^>]*)\">([^<]*)</a>");
    Matcher m = p
    .matcher("s<font>adf<a href=\"ssadfas.html\">sdfsdf</a>sadsdffs<a href=\"sdf.html\">asdf</a>df");
    while (m.find()) {
    System.out.println("a=" + m.group());
    System.out.println("href=" + m.group(1));
    System.out.println("topic=" + m.group(2));
    }