Java中的正则表达式

来源:互联网 发布:淘宝店铺同步到手机端 编辑:程序博客网 时间:2024/06/08 14:22

1.基本元字符与环视:

  • . : 匹配除换行符 \n 之外的任何单字符
  • +: 出现1次或者多次;(至少一次)
  • *: 0次、1次或者多次;(任何次数)
  • ?:0次、1次(最多一次)
  • $: 匹配结尾位置
  • ^: 匹配开始位置
  • (? <= exp):匹配前面是exp的数据:(?<=B)即BAAA匹配,而CAAA不匹配 ;
  • (?<!exp):匹配前面不是exp的数据:(?<!B) 即CAAA匹配,而BAAA不匹配;
  • (?= exp):匹配后面是exp的数据:(?=B)即AAAB匹配,而AAAC不匹配;
  • (?!=exp):匹配后面不是exp的数据:(?!=B)即AAAC能匹配,而AAAB不能匹配。

菜鸟教程中正则表达式中的元字符


2.用到的相关类:

java.util.regex

  1. Pattern类:
    pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。

  2. Matcher 类:
    Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

  3. PatternSyntaxException:
    PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。


3.正则表达式的贪婪与非贪婪匹配
eg:

String string = “abcaxc”;
Patter p = “ab*c”
贪婪匹配:趋向于最大长度的匹配;如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c)。

非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c)。

默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。


package com.mark.TestOther;import java.util.regex.Matcher;import java.util.regex.Pattern;public class regexTest {    private static String string= "abcaxc";    public static void getTarget(){        String regex = "ab.*?c";        Pattern pattern = Pattern.compile(regex);        Matcher matcher = pattern.matcher(string);        //方法扫描输入序列以查找与该模式匹配的下一个子序列。        while(matcher.find()){             // 返回由以前匹配操作所匹配的输入子序列。            System.out.print(matcher.group());        }    }    public static void main(String[] args) {        getTarget();    }}

运行结果:

abc

如果:String regex = “ab.*c”;则获得的结果是:abcaxc


package dong.test;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * 使用正则表达式取出()里的内容 * @author YIMA * */public class RegexUtil {    public static String getContentWithinBraces(String expression){        String regex = "\\(([^)]*)\\)";        Pattern p = Pattern.compile(regex);        Matcher matcher = p.matcher(expression);        while (matcher.find()) {            return matcher.group(1);        }        return null;    }    public static void main(String[] args) {        String expression = "Japan Kansai-Thailand Service (JST)";        String result = RegexUtil.getContentWithinBraces(expression);        System.out.println(result);    }}

输出结果:

(JST)

  • \( 表示:匹配左括号;
  • ([^)]*) 表示:匹配除了右括号的任意字符;
  • \)表示:匹配右括号。

Java中用正则表达式截取字符串中第一个出现的英文左括号之前的字符串。比如:北京市(海淀区)(朝阳区)(西城区),截取结果为:北京市。

package com.mark.TestOther;import java.util.regex.Matcher;import java.util.regex.Pattern;public class regexTest {    private static String string= "北京市(海淀区)(朝阳区)(西城区)";    public static void getTarget(){        String regex = ".*?(?=\\()";        Pattern pattern = Pattern.compile(regex);        Matcher matcher = pattern.matcher(string);        if(matcher.find()){            System.out.println(matcher.group());        }    }    public static void main(String[] args) {        getTarget();    }}
  • .*? 表示:非贪婪匹配, 即找到最小的就可以了
  • (?=\()表示:找到左括号
    如果:String regex = “.*(?=\()”;则输出的结果是:北京市(海淀区)(朝阳区)

原字符串:

id=Content href="javascript:WebForm(new WebForm(PointToPointDetail.aspx&quot;, false, true))

期望结果:匹配出

javascript:WebForm(new WebForm(PointToPointDetail.aspx&quot;, false, true))

示例代码:

package com.mark.TestOther;import java.util.regex.Matcher;import java.util.regex.Pattern;public class PatternTest {    public static void main(String[] args) {        PatternTest test = new PatternTest();        test.test1();    }    private void test1() {        //  正则表达式: \s+href="([^"]+)        //  \s+:前面出现一个,或者多个的空白字符(包括空格、制表符、换页符);这里就是匹配到href前面的空格        //  [^"]:匹配除了双引号的其他字符        //  [^"]+:匹配一个以上        //  ([^"]+):匹配 [^"]+ 并获取这一匹配。        String regex ="\\s+href=\"([^\"]+)";//正则表达式        String expression = "id=Content href=\"javascript:WebForm(new WebForm(PointToPointDetail.aspx&quot;, false, true))";        Pattern p = Pattern.compile(regex);        Matcher matcher = p.matcher(expression);        String result = matcher.find()?matcher.group(1):"";        System.out.println(result);    }}