正则表达式-如何匹配一对符号内的内容

摘要:以引号""为例来介绍如何使用正则匹配。


例一:


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {

    public static void main(String[] args) {
        String regEx = "\"(.+)\"";
        String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(source);

        while (matcher.find()) {
            String result = matcher.group(0);
            System.out.println(result);
        }
    }
}


返回结果:

"McDon ald's" is said "markudonarudo"

例二:


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {

    public static void main(String[] args) {
        String regEx = "\"([^\"]+)\"";
        String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(source);

        while (matcher.find()) {
            String result = matcher.group(0);
            System.out.println(result);
        }
    }
}

返回结果:

"McDon ald's"
"markudonarudo"

        其实我想要的结果是第二种,区别是第二种我是用的是排除型字符组 [^],而第一种使用的是 .+。那么我们接着使用 .+ 来分析。

        因为.可以匹配任意字符,[^\"] 只能匹配非引号(")之外的任意字符,加上正则的贪婪性,就一直往后匹配到结尾, 又由于结束符是一个引号("),所以匹配的结尾是不满足条件的,再往前一个字符一个字符的移动,直到匹配到引号("),所以就得到了例一的结果。

那么如何让它不贪婪而达到例二的效果呢,请看例三


例三:


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {

    public static void main(String[] args) {
        String regEx = "\"(.+?)\"";
        String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(source);

        while (matcher.find()) {
            String result = matcher.group(0);
            System.out.println(result);
        }
    }
}

返回结果:

"McDon ald's"
"markudonarudo"

        现在看起来例三例二的结果一样了。这次使用了懒惰模式,使用了?,就把贪婪模式变为懒惰模式,顾名思义,就是能接受就结束,可以把贪婪模式理解为从第一个匹配位置开始的逆向匹配,而懒惰模式可以理解为从第一个匹配位置开始的正向匹配,就是找到能匹配到的末尾引号(")就结束。


情景故事:

.+?的意思是在匹配的前提下,尽可能少的匹配,怎么样理解尽可能少,如此例中,.+?本来可以像上一个例子中,匹配一大串,但是由于后面有个?总是催促:“你匹配好了没有,该我了吧?”,所以,.+心理很烦,变得很懒了,在第一“收尾的时候就停下来了,这样就得到了正确的结果。

例四:


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {

    public static void main(String[] args) {
        String regEx = "(?<=\")(.+?)(?=\")";
        String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(source);

        while (matcher.find()) {
            String result = matcher.group(0);
            System.out.println(result);
        }
    }
}

返回结果:

McDon ald's
 is said 
markudonarudo

        这种情况就是出现了环视,两个一号之间的都匹配出来了,这次来分析一下这个正则表达式。

1. ?单独使用就成了最好匹配一次,即使不匹配也可以的元字符,所以懒惰的用法应该是紧跟着贪婪元字符的后面

2. (?<=")代表这个位置的左边必须有一个"  ,既然正则不会占用" ,它只需要左边是 " 右边是什么它不会管,这样我们可以认为它占用了一个什么都不是的缝隙位置,这个缝隙位置只有一个要求就是左边是 "

3. (?=\")的意思是占用两个字符之间的缝隙位置,缝隙位置的右边是"


        由于环视都不会占用字符,而缝隙只是理解,并不存在真正的缝隙,这样匹配结束后的位置只是到达s  和 "之间的位置,下一次匹配的时候就会把 " 也匹配上。


例五:


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {

    public static void main(String[] args) {
        String regEx = "\"((?!\").)+\"";
        String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(source);

        while (matcher.find()) {
            String result = matcher.group(0);
            System.out.println(result);
        }
    }
}

运行结果:

"McDon ald's"
"markudonarudo"

        例四是环视, 例五就排除环视。

1. (?!\").的意思是一个位置的右边不能是" ,然后后面接了一个.  ,就是说.表示的其他字符都行,就是不能是"


原文链接:正则表达式---获取英文双引号里面的内容


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值