首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么行的这一端(\\b)在字符串/ICU和Perl中不被识别为单词边界

为什么行的这一端(\\b)在字符串/ICU和Perl中不被识别为单词边界
EN

Stack Overflow用户
提问于 2016-12-15 23:23:20
回答 2查看 338关注 0票数 6

使用stringr,我试图检测字符串末尾的符号,如下所示:

代码语言:javascript
运行
复制
str_detect("my text €", "€\\b") # FALSE

为什么这不管用?它正在处理下列案件:

代码语言:javascript
运行
复制
str_detect("my text a", "a\\b") # TRUE - letter instead of €
grepl("€\\b", "2009in €") # TRUE - base R solution

但是它在perl模式下也失败了:

代码语言:javascript
运行
复制
grepl("€\\b", "2009in €", perl=TRUE) # FALSE

那么,€\\b-regex有什么问题呢?regex €$在所有情况下都有效.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-15 23:47:55

当您使用没有perl=TRUE的基regex函数时,将使用重排香精

这个词的边界似乎是:

  • 在非字字符之后使用时,与字符串位置的末尾匹配,以及
  • 在非字字符之前使用时,与字符串位置的开始匹配。

见R测试:

代码语言:javascript
运行
复制
> gsub("\\b\\)", "HERE", ") 2009in )")
[1] "HERE 2009in )"
> gsub("\\)\\b", "HERE", ") 2009in )")
[1] ") 2009in HERE"
> 

这不是PCRE和ICU regex风格中字界的常见行为,在非单词字符之前的单词边界仅在字符前面有一个单词字符(不包括字符串位置的开始时匹配)(在非单词字符后面使用时,需要在单词边界后面出现一个单词字符):

有三个不同的位置被限定为单词边界:- Before the first character in the string, if the first character is a word character. - After the last character in the string, if the last character is a word character. - Between two characters in the string, where one is a word character and the other is not a word character.

票数 4
EN

Stack Overflow用户

发布于 2016-12-15 23:47:13

代码语言:javascript
运行
复制
\b

等于

代码语言:javascript
运行
复制
(?:(?<!\w)(?=\w)|(?<=\w)(?!\w))

也就是说它符合

  • 在单词字符和非单词字符之间,
  • 在单词字符和字符串的开头之间,以及
  • 在单词字符和字符串末尾之间。

是一个符号,符号不是单词字符。

代码语言:javascript
运行
复制
$ uniprops €
U+20AC <€> \N{EURO SIGN}
    \pS \p{Sc}
    All Any Assigned Common Zyyy Currency_Symbol Sc Currency_Symbols S Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Print X_POSIX_Print Symbol Unicode

如果您的语言支持“后看”和“看头”,那么您可以使用以下方法在空间和非空间之间找到一个边界(将开始和结束作为一个空间)。

代码语言:javascript
运行
复制
(?:(?<!\S)(?=\S)|(?<=\S)(?!\S))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41174959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档