日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

正则基础之——\b 单词边界

發(fā)布時間:2023/12/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 正则基础之——\b 单词边界 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1?????? ?概述

\b”匹配單詞邊界,不匹配任何字符。

\b”匹配的只是一個位置,這個位置的一側(cè)是構(gòu)成單詞的字符,另一側(cè)為非單詞字符、字符串的開始或結(jié)束位置。“\b”是零寬度的。

基本上所有的資料里都會說“\b”是單詞邊界,但是關(guān)于“單詞”的范圍卻是少有提及。通常情況下,正則表達(dá)式中所謂的“單詞”,就是由“\w”所定義的字符所組成的子串。

\b”表示所在位置的一側(cè)為單詞字符,另一側(cè)為非單詞字符、字符串的開始或結(jié)束位置,也就相當(dāng)于

(?<!\w)(?=\w)|(?<=\w)(?!\w)

思考:以下寫法為什么不等價于“\b

(?<=\W)(?=\w)|(?<=\w)(?=\W)

2?????? \w的范圍

即然涉及到“\w”,那就要先考察一下它的范圍。

在支持ASCII碼的語言中,如JavaScript,“\w”等價于[a-zA-Z0-9_] ;

在支持Unicode的語言中,如.NET,默認(rèn)情況下,“\w”除可以匹配[a-zA-Z0-9_]外,還可以匹配一些Unicode字符集,如漢字,全角數(shù)字等等。

幾乎所有常見的語言都遵循這樣一個規(guī)律,只有Java是個例外。在Java中,“\w”的表現(xiàn)是比較奇怪的,Java是支持Unicode的,但Java的正則中的“\w”卻是等價于[a-zA-Z0-9_]的。

先來看一下“\w”在幾種語言中匹配的例子

JavaScript

<script language="javascript">

??? var str = "abc_123中文_d3=efg漢字%";

??? var reg = /\w+/g;

??? var arr = str.match(reg);

??? if(arr != null)

??? {

??????? for(var i=0;i<arr.length;i++)

??????? {

??????????? document.write(arr[i] + "<br />");

??????? }

??? }

</script>

/*-------- JavaScript中輸出--------

abc_123

_d3

Efg

*/

C#

string test = "abc_123中文_d3=efg漢字%";

MatchCollection mc = Regex.Matches(test, @"\w+");

foreach (Match m in mc)

{

???? richTextBox2.Text += m.Value + "\n";

}

/*-------- C#中輸出--------

abc_123中文_d3

efg漢字

*/

Java

String test = "abc_123中文_d3=efg漢字%";

String reg = "\\w+";

Matcher m = Pattern.compile(reg).matcher(test);

while(m.find())

{

??? System.out.println(m.group());

}

/*-------- Java中輸出--------

abc_123

_d3

Efg

*/

可以看到,“\w”在Java中的輸出和JavaScript中是一樣的,都是只支持ASCII字符。

3?????? \b的范圍

常見語言中“\w”的范圍確定了,那么是不是可以認(rèn)為“\b”的匹配范圍與“\w”也是一致的呢?

再看下下面的例子:

源字符串:abc_123中文_d3=漢字efg

正則表達(dá)式:.\b.

JavaScript

<script language="javascript">

??? var str = "abc_123中文_d3=efg漢字%";

??? var reg = /.\b./g;

??? var arr = str.match(reg);

??? if(arr != null)

??? {

??????? for(var i=0;i<arr.length;i++)

??????? {

??????????? document.write(arr[i] + "<br />");

??????? }

??? }

</script>

/*-------- JavaScript中輸出--------

3中

文_

3=

g漢

*/

C#

string test = "abc_123中文_d3=efg漢字%";

MatchCollection mc = Regex.Matches(test, @".\b.");

foreach (Match m in mc)

{

???? richTextBox2.Text += m.Value + "\n";

}

/*-------- C#中輸出--------

3=

字%

*/

Java

String test = "abc_123中文_d3=efg漢字%";

String reg = ".\\b.";

Matcher m = Pattern.compile(reg).matcher(test);

while(m.find())

{

??? System.out.println(m.group());

}

/*-------- Java中輸出--------

3=

字%

*/

可以看到,Java的輸出和.NET是一致的,“\b”在Java中是支持Unicode的。

所以總的來說,Java中的“\w”是很奇怪的,而“\b”是與其它語言表現(xiàn)一致的,在使用時需要注意。

4?????? \b應(yīng)用場景

4.1???? 基礎(chǔ)應(yīng)用

\b”一般應(yīng)用在需要匹配某一單詞字符組成的子串,但這一字符不能包含在同樣由單詞字符組成的更長的子串中。

比如要替換掉一段英文中的單詞“to”,而“today”顯然不在替換的范圍內(nèi),所以正則可以用“\bto\b”來限定。

用得比較多的場景是在HTML標(biāo)簽的匹配中,用以區(qū)分相互包含的標(biāo)簽,比如要過濾掉<b>、</b>、<p…>、<img…>等標(biāo)簽,但要保留<br />標(biāo)簽,正則可以寫成“<(/?b|p|img)\b[^>]*>”。

舉例:統(tǒng)計(jì)以“,”分割的元素中“3”的個數(shù)

string test = "137,1,33,4,3,6,21,3,35,93,2,98";

int count = Regex.Matches(test, @"\b3\b").Count; //結(jié)果:2

4.2???? 進(jìn)階應(yīng)用

稍復(fù)雜一些的應(yīng)用通常都是與其它一些正則語法規(guī)則一起使用的,參考一個帖子 求一正則表達(dá)式

4.3???? 特殊情況

\b”用在正則中,通常情況下都是表示單詞邊界的,只有在字符組中,它表示的是退格鍵,即

[a-z\b]

此處的“\b”表示的是退格鍵,而不是單詞邊界。

轉(zhuǎn)載于:https://www.cnblogs.com/Eleanore/archive/2012/06/13/2548227.html

總結(jié)

以上是生活随笔為你收集整理的正则基础之——\b 单词边界的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。