我被正则表达式的单词边界搞糊涂了

zebds_regex 2017-03-10 03:13:19
越搞越糊涂了,大家看我的几个例子,再回答一下吧,谢谢!
第一个例子:关于\b的
var str='Who are you? I\'m a boss'
var re=/a\b/g
alert(str.match(re))
// /\ba/g和/a/g这样会匹配出a,a
// /a\b/g和/\ba\b/g会匹配出a,并且这个a是BOSS前面的a
这第一个例子,我没有说错吧?

第二个例子:关于\B的
var str='你是s谁?我s是你老板'
var re=/是\B/g
alert(str.match(re))
// /\B是/g匹配的是第一个是
// /是\B/g匹配的是第二个是
这第二个例子,我也没有说错吧?

犀牛书上说,\b匹配一个单词的边界,简言之,就是位于\w和\W之间的位置,或者位于字符\w和字符串的开头或者结尾之间的位置,而\B匹配的是非单词边界。(于是我区别\b和\B的标准,就是以\W和\w为标准区分的,简单来说,就是匹配非单词的时候,必须以单词作为边界划分,我不知道这句话正确与否,有待你们的考证

于是,可以得到结论,这个结论我是看菜鸟教程的。\b 字符的位置是非常重要的。如果它位于要匹配的字符串的开始,它在单词的开始处查找匹配项。如果它位于字符串的结尾,它在单词的结尾处查找匹配项。其实这句话我似懂非懂。

于是我按照上述的理论,做了下面的实验以验证,结果我糊涂了
var str = "abc_123中文_d3=efg汉字a";
var reg = /[\u4e00-\u9fa5]\B/g;
var arr = str.match(reg);
alert(arr)
弹出的结果是: \B的时候,匹配到'中和汉';’\b的时候匹配到'文和字'。我不是很理解为什么匹配到这个结果,求解?
当把 reg = /[\u4e00-\u9fa5]\B/g改为var reg = /\B[\u4e00-\u9fa5]\B/g的时候,弹出结果为null,按照我的理解,应该会匹配到"汉字"两个字的,所以我彻底糊涂了,求解啊
;

说白了,就是不懂单词边界的意思,有没准确又容易理解的方式?
...全文
377 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_41985818 2018-08-20
  • 打赏
  • 举报
回复
举两个例子,一通百通,相信我
var str="123abc_帅哥_fsi就nima的是我";
var reg=/\b[\u4e00-\u9fa5]/g; //帅,就,的
alert(str.match(reg));
这个正则用人话来说就是“全局找出一个汉字,这个汉字是以单词为左边界的”
你说的想通过\B...\B来获取全部中文为什么跳出来null;把你的正则用人话翻译一下:“全局找出一个汉字,这个汉字左右都是非单词”,你找找看,找的出来么?当然是null了
zebds_regex 2017-03-10
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
var str = "abc_123中文_d3=efg汉字a"; 
var reg = /[\u4e00-\u9fa5]\B/g;
var arr = str.match(reg); 
document.write(arr) //中,汉

var reg = /[\u4e00-\u9fa5]\b/g;
var arr = str.match(reg); 
document.write(arr) //文,字

var reg = /.\b/g;
var arr = str.match(reg); 
document.write(arr) //3,文,3,=,g,字,a

var reg = /.\B/g;
var arr = str.match(reg); 
document.write(arr) //a,b,c,_,1,2,中,_,d,e,f,汉
可知: 所谓单词是以变量命名规则为基础的,字母、数字、下划线都是 单词 的成员 \b 表示 单词和非单词 的边界 /a\b/ 是不会匹配到 ab 的,因为 a 后面的 b 是单词 \B 依然 至于 /\B[\u4e00-\u9fa5]\B/g 匹配不到内容,那是因为没有符合条件的组合 g汉字a 两边都是单词 而 \b 就行
var reg = /\b[\u4e00-\u9fa5]+\b/g;
var arr = str.match(reg); 
document.write(arr) //中文,汉字
最后问一个问题, var str='你是s谁?我s是你老板' var re=/是\B/g alert(str.match(re)) // /\B是/g匹配的是第一个是 // /是\B/g匹配的是第二个是 这个例子,我的注释错了吗?
zebds_regex 2017-03-10
  • 打赏
  • 举报
回复
引用 3 楼 jslang 的回复:
弹出的结果是: \B的时候,匹配到'中和汉';’\b的时候匹配到'文和字'。我不是很理解为什么匹配到这个结果,求解? 因为'文'和'字'后面分别是 _ 和 a 属于\w范围,这样'文'和'字'后面就有单词边界,但是这个单词边界是真对_ 和 a的,不是真对中文的。 而'中'和'汉'后面没有属于\w范围的字符,就没有单词边界。
最后问一个问题, var str='你是s谁?我s是你老板' var re=/是\B/g alert(str.match(re)) // /\B是/g匹配的是第一个是 // /是\B/g匹配的是第二个是 这个例子,我的注释错了吗?
  • 打赏
  • 举报
回复
引用 3 楼 jslang 的回复:
弹出的结果是: \B的时候,匹配到'中和汉';’\b的时候匹配到'文和字'。我不是很理解为什么匹配到这个结果,求解? 因为'文'和'字'后面分别是 _ 和 a 属于\w范围,这样'文'和'字'后面就有单词边界,但是这个单词边界是真对_ 和 a的,不是真对中文的。 而'中'和'汉'后面没有属于\w范围的字符,就没有单词边界。
这个问题在javascript中可以这么理解,但在有些语言里面,就不是这样的,比如java里面
xuzuning 2017-03-10
  • 打赏
  • 举报
回复
var str = "abc_123中文_d3=efg汉字a"; 
var reg = /[\u4e00-\u9fa5]\B/g;
var arr = str.match(reg); 
document.write(arr) //中,汉

var reg = /[\u4e00-\u9fa5]\b/g;
var arr = str.match(reg); 
document.write(arr) //文,字

var reg = /.\b/g;
var arr = str.match(reg); 
document.write(arr) //3,文,3,=,g,字,a

var reg = /.\B/g;
var arr = str.match(reg); 
document.write(arr) //a,b,c,_,1,2,中,_,d,e,f,汉
可知: 所谓单词是以变量命名规则为基础的,字母、数字、下划线都是 单词 的成员 \b 表示 单词和非单词 的边界 /a\b/ 是不会匹配到 ab 的,因为 a 后面的 b 是单词 \B 依然 至于 /\B[\u4e00-\u9fa5]\B/g 匹配不到内容,那是因为没有符合条件的组合 g汉字a 两边都是单词 而 \b 就行
var reg = /\b[\u4e00-\u9fa5]+\b/g;
var arr = str.match(reg); 
document.write(arr) //中文,汉字
天际的海浪 2017-03-10
  • 打赏
  • 举报
回复
弹出的结果是: \B的时候,匹配到'中和汉';’\b的时候匹配到'文和字'。我不是很理解为什么匹配到这个结果,求解? 因为'文'和'字'后面分别是 _ 和 a 属于\w范围,这样'文'和'字'后面就有单词边界,但是这个单词边界是真对_ 和 a的,不是真对中文的。 而'中'和'汉'后面没有属于\w范围的字符,就没有单词边界。
  • 打赏
  • 举报
回复
引用 1 楼 jslang 的回复:
\b和\B 都是只真对英文单词的边界的,是英文单词,英文单词,是英文,对中文是无效的。
你说的这一点我不认同,\b和\B同样对中文有效
天际的海浪 2017-03-10
  • 打赏
  • 举报
回复
\b和\B 都是只真对英文单词的边界的,是英文单词,英文单词,是英文,对中文是无效的。

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧