`

正则表达式"\w"和"\b"在不同语言中的用法注意

 
阅读更多

 

\b”匹配单词边界,不匹配任何字符。

 

\b”匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。“\b”是零宽度的。

 

基本上所有的资料里都会说“\b”是单词边界,但是关于单词的范围却是少有提及。通常情况下,正则表达式中所谓的单词,就是由“\w”所定义的字符所组成的子串。

 

\b”表示所在位置的一侧为单词字符,另一侧为非单词字符、字符串的开始或结束位置,也就相当于

 

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

 

思考:以下写法为什么不等价于“\b

 

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

 

2\w的范围

 

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

 

在支持ASCII码的语言中,如JavaScript,“\w”等价于[a-zA-Z0-9_]

 

在支持Unicode的语言中,如.NET,默认情况下,“\w”除可以匹配[a-zA-Z0-9_]外,还可以匹配一些Unicode字符集,如汉字,全角数字等等。

 

几乎所有常见的语言都遵循这样一个规律,只有Java是个例外。在Java中,“\w”的表现是比较奇怪的,Java是支持Unicode的,但Java的正则中的“\w”却是等价于[a-zA-Z0-9_]的。

 

先来看一下“\w”在几种语言中匹配的例子

 

JavaScript

 

<scriptlanguage="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”的范围确定了,那么是不是可以认为“\b”的匹配范围与“\w”也是一致的呢?

 

再看下下面的例子:

 

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

 

正则表达式:.\b.

 

JavaScript

 

<scriptlanguage="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”是与其它语言表现一致的,在使用时需要注意。

 

4\b应用场景

 

4.1基础应用

 

\b”一般应用在需要匹配某一单词字符组成的子串,但这一字符不能包含在同样由单词字符组成的更长的子串中。

 

比如要替换掉一段英文中的单词“to”,而“today”显然不在替换的范围内,所以正则可以用“\bto\b”来限定。

 

用得比较多的场景是在HTML标签的匹配中,用以区分相互包含的标签,比如要过滤掉<b></b><p…><img…>等标签,但要保留<br />标签,正则可以写成“<(/?b|p|img)\b[^>]*>”。

 

举例:统计以“,”分割的元素中“3”的个数

 

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

 

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

 

4.2进阶应用

 

稍复杂一些的应用通常都是与其它一些正则语法规则一起使用的,参考一个帖子 求一正则表达式

 

4.3特殊情况

 

\b”用在正则中,通常情况下都是表示单词边界的,只有在字符组中,它表示的是退格键,即

 

[a-z\b]

 

此处的“\b”表示的是退格键,而不是单词边界。

 

分享到:
评论

相关推荐

    测试正则表达式软件

    在Java编程语言中,正则表达式是一个强大的工具,能够帮助开发者高效地处理字符串。本文将详细介绍如何在Java中使用正则表达式以及测试正则表达式的软件。 首先,让我们了解一下Java中的正则表达式基础。在Java中,...

    Java正则表达式 Java 正则表达式

    Java正则表达式是Java语言中用于处理字符串的强大工具,它允许程序员进行复杂的字符串匹配、查找和替换操作。正则表达式(Regular Expression)是一种模式匹配语言,通过特定的语法来描述字符串的模式,用于在文本中...

    第11.25节 Python正则表达式编译re.compile及正则对象使用.rar

    在Python编程语言中,正则表达式是一种强大的文本处理工具,用于匹配、查找、替换等操作。本节将深入探讨`re.compile()`函数及其在创建正则表达式对象中的应用。`re.compile()`是Python标准库`re`模块中的一员,它...

    正则表达式工具类,正则表达式封装,Java正则表达式

    在Java编程语言中,正则表达式是一种强大的文本处理工具,用于匹配、查找、替换等操作。本节我们将深入探讨正则表达式工具类`RegUtils`,它封装了正则表达式的常用功能,便于在实际开发中进行复用。 首先,`...

    正则表达式学习心得 v1.0

    本文旨在分享作者在学习正则表达式过程中的心得体验,并重点介绍了几种常见编程语言(Python、C#、PHP)及文本编辑器(Notepad++)中正则表达式的使用技巧。此外,还特别对比了不同语言之间正则表达式的异同之处。 ...

    正则表达式.txt,正则表达式.txt

    在编程语言中,几乎所有现代语言都支持正则表达式的使用,例如 Java、Python、JavaScript 等。此外,在日常工作中使用的工具如 grep、sed 和 awk 等也支持正则表达式的操作。 #### 三、基本概念介绍 1. **元字符**...

    Source Insight_正则表达式举例

    ### 正则表达式在Source Insight中的...以上是Source Insight中正则表达式的一些基本应用实例,通过对这些例子的理解,可以帮助开发者更好地掌握正则表达式的使用方法,并在实际的开发工作中高效地进行文本匹配和处理。

    Python正则表达式基础

    在高级应用中,对于给定的正则表达式,应当注意引擎如何执行并编写以提高字节码运行的效率。正则表达式语言较小,因此并不是所有的字符串处理任务都可以使用它完成。有些任务虽然能用正则表达式完成,但可能非常复杂...

    c# 正则表达式生成工具 源代码

    在IT领域,正则表达式...通过对这个源代码的分析和学习,开发者不仅可以掌握C#正则表达式的基本用法,还能了解到一些高级特性和实际应用中的技巧。这对于提升软件开发能力,特别是在处理文本数据时,是非常有帮助的。

    SAP ABAP 正则表达式 Regular expressions

    需要注意的是,ABAP的正则表达式语义可能与其他语言(如Perl、Java)有所不同,因此使用专门针对ABAP的工具进行测试显得尤为重要。 这就是Regex Toy的作用所在。这个小型的交互式工具专为ABAP开发者设计,旨在快速...

    正则表达式II 正则表达式

    在本章节中,我们将深入探讨正则表达式的一些高级用法及其在不同编程环境中的应用。 #### 二、正则表达式的基本语法与符号 正则表达式由一系列字符和特殊符号组成,这些符号赋予了正则表达式强大的匹配能力。下面...

    C#正则表达式语法大全

    C#正则表达式语法大全涵盖了在C#编程语言中使用正则表达式进行文本匹配、提取、替换等操作所必需的语法知识。正则表达式是一种强大的文本处理工具,它可以描述字符串的模式,让我们能够执行复杂的搜索和匹配操作。 ...

    正则表达式帮助文档(正则表达式)

    - 在正则表达式中,一些特殊字符如`(`、`)`、`.`、`*`等需要使用`\`进行转义,以便进行字面值匹配。 4. **分组与反向引用**: - `(pattern)`用于创建一个捕获组,可以对一组字符进行操作,如重复、或操作等。 - ...

    正则表达式教材资料合集

    10. **正则表达式引擎**:不同的编程语言或工具可能使用不同的正则表达式引擎,如Perl兼容正则表达式(PCRE)和JavaScript的正则引擎,它们在某些细节上可能存在差异。 通过深入学习本资料合集中的教材,你将能够...

    JavaScript正则表达式迷你书

    《JavaScript正则表达式迷你书》是一本关于JavaScript正则表达式的专业书籍,正则表达式是处理字符串的强大工具,广泛应用于编程语言中的文本处理。本书从字符匹配、位置匹配、括号的作用、回溯法原理、拆分、构建和...

    正则表达式 电子书 教程 chm

    在不同编程语言中,正则表达式的实现可能会有差异,但大多数都遵循Perl风格或POSIX标准。例如,Python的`re`模块和JavaScript的`RegExp`对象提供了丰富的功能,支持正则表达式的编译、执行和调试。 CHM(Compiled ...

    正则表达式学习课件PPT

    正则表达式是一种强大的文本处理工具,用于在字符串中匹配、查找、替换或者提取符合特定模式的文本。在编程领域,正则表达式是程序员必备的技能之一,它被广泛应用于数据验证、文本分析和数据提取等多个场景。本课件...

    正则表达式demo全

    在编程语言中,正则表达式被广泛用于数据验证、文本搜索和替换等场景。这个“正则表达式demo全”很可能是包含了一系列关于正则表达式的实例,用于帮助学习者理解和掌握正则表达式的用法。 正则表达式的语法包括基本...

    《正则表达式中文手册》

    正则表达式是一种强大而灵活的文本处理工具,广泛应用于多种编程语言中,用于文本的搜索、替换和提取等操作。掌握正则表达式的使用对于任何从事软件开发工作的人员来说都是极其重要的。 #### 二、什么是正则表达式...

Global site tag (gtag.js) - Google Analytics