正则中\\b和\\B的区别及注意事项

前端之家收集整理的这篇文章主要介绍了正则中\\b和\\B的区别及注意事项前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文的正则用Java代码表示@H_301_2@

要看本篇博客首先你得会,别人给你个正则表达式你得熟练写出Java代码,这里有一篇Java正则的基础:
Java正则的基本用法@H_301_2@

\b和\B的区别

\b和\B都是边界符。不同的是\b是单词分界符,而\B是非单词分界符。
这样也就注定了它们的匹配是不同的。@H_301_2@

\b的用法@H_301_2@

这里的\b,单词边界符能够匹配中文符号、英文符号、空格、制表符、回车符号,以及各种边界,比如单词在开头,单词在结尾。
这里要匹配的2也可以是中文。正则是可以处理中文的。@H_301_2@

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

public class p3{
    public static void main(String args[]){
        String sta=",2,";
        String regex="\\b2\\b";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher=pattern.matcher(sta);

        while(matcher.find()){
            System.out.println(true);
            System.out.println(matcher.group());
        }
    }
}

运行结果:@H_301_2@

true
2

\B的用法
\B是非单词分界符,即可以查出是否包含某个字,如“北斗狼神”中是否包含“狼”这个字。@H_301_2@

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

public class p2{
    public static void main(String args[]){
        String sta="北斗狼神";
        String regex="\\B狼\\B";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher=pattern.matcher(sta);

        while(matcher.find()){
            System.out.println(true);
            System.out.println(matcher.group());
        }
    }
}

运行结果:@H_301_2@

true

上面就是\b和\B的基本用法@H_301_2@

\b和\B的注意事项

因为\b和\B是边界匹配符,所以一般不用来判断当前字符串是否符合某种规则,这样是不行的。@H_301_2@

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


public class p1{
    public static void main(String args[]){
        String sta=" 1 ";
        String regex="\\b1\\b";

        System.out.println(sta.matches(regex));

    }
}

运行结果:@H_301_2@

false

刚开始我以为输出的是true,结果是false@H_301_2@

所以\b和\B这种边界符一般用来获取,而不是用来判断、替换。@H_301_2@

但是,我就想知道\b到底为什么不能够匹配上面这个例子呢???而不仅仅说它是边界匹配符就了事了,那如果我问你,什么是边界符匹配呢???你是否能够答上,而不是仅仅背概念那么简单!!!@H_301_2@

好,那么看这个例子:@H_301_2@

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


public class p1{
    public static void main(String args[]){
        String sta="(??213lang狼13我是华丽分界线中文问号和英文问号?????我是华丽分界线空格 我是华丽分界线换行\n我是华丽分界线制表符 ";
        String regex="\\b";

        String arrays[]=sta.split(regex);
        for(String i:arrays){
            System.out.println("["+i+"]");
        }

    }
}

运行结果:@H_301_2@

[(??]
[213lang狼13我是华丽分界线中文问号和英文问号]
[?????]
[我是华丽分界线空格]
[ ]
[我是华丽分界线换行]
[
]
[我是华丽分界线制表符]
[       ]

那么是不是有所启发了??单词边界就是,单词和符号的边界,这里的单词可以是数字、英文单词、中文单词并且这些单词不互斥。而符号可以是英文符号、中文符号、空格、制表符、换行,而符号间不互斥。@H_301_2@

就是因为\b是匹配这种边界。所以当我们想判断“ 1 ”用正则规则“\\b1\\b”是否匹配的时候,这是不能够匹配的。因为空格不是边界,而空格和1之间那个边界才是\b匹配的边界。@H_301_2@

所以只有当我们这样写才是true
看例子:@H_301_2@

public class p4{
    public static void main(String args[]){
        String sta="1";
        String regex="\\b1\\b";

        System.out.println(sta.matches(regex));
    }
}

运行结果:@H_301_2@

true

反之,\B的边界就是单词和单词之间的边界。这种事情根本就是想都不用想了。对不对呢??各位读者??
不过还是来个例子吧!!@H_301_2@

首先我要声明\B相当于[^\b]。
看例子:@H_301_2@

public class p5{
    public static void main(String args[]){
        String sta="123lang北斗狼神-,??????-";
        String regex="\\B";

        String arrays[]=sta.split(regex);
        for(String i:arrays){
            System.out.println("["+i+"]");
        }
    }
}

运行结果:@H_301_2@

[1]
[2]
[3]
[l]
[a]
[n]
[g]
[北]
[斗]
[狼]
[神-]
[,]
[,]
[?]
[?]
[?]
[?]
[?]
[?]
[-]

是不是有点让人惊讶??还是你的意料之中??@H_301_2@

感觉意料之中的人就不用看下面了,因为你是个很聪明的人。@H_301_2@

感觉惊讶的人,也没什么大不了的,因为作者我想的答案和这个答案也是有出入的。@H_301_2@

但是不管怎么样,我们都会走上,懂!!!的那条路!!!@H_301_2@

在这个例子开始前我也声明过,\B相当于[^\\b]。^是相反的意思,可以查看API。@H_301_2@

所以,\b的作用是单词和符号之间的边界。而我们分割的也是单词和符号之间的边界。所以它的相反面就是,单词和符号之间的边界不是我的边界,而单词和单词之间的边界和符号和符号之间的边界就是我的边界。@H_301_2@

所以在这个例子中“北斗狼神”中“神”字后面还有一个符号“-”,即:单词和符号之间的边界不是\B的边界,而单词和单词之间的边界和符号和符号之间的边界就是\B的边界。@H_301_2@

原文链接:https://www.f2er.com/regex/358770.html

猜你在找的正则表达式相关文章