首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当连字符包围单个内部字符时如何替换字内连字符

当连字符包围单个内部字符时如何替换字内连字符
EN

Stack Overflow用户
提问于 2016-01-28 21:13:56
回答 2查看 104关注 0票数 4

在标记之前,我希望保留文本中的字内连字符。策略包括用连字符代替唯一字符,然后在标记后用连字符替换该唯一字符。注意:我最终将使用Pd的Unicode类来捕获所有形式的破折号字符,但是这里我保持简单,因为我认为这个部分与问题无关。

问题:当一个单词包含分隔单个字符的多个内连字符时,它会失败。

实例和期望的结果:

代码语言:javascript
复制
replaceDash <- function(x) gsub("(\\w)-(\\w)", "\\1§\\2", x)

# these are all OK
replaceDash("Hawaii-Five-O")  
## [1] "Hawaii§Five§O"
replaceDash("jack-of-all-trades")  
## [1] "jack§of§all§trades"
replaceDash("A-bomb")         
## [1] "A§bomb"
replaceDash("freakin-A")      
## [1] "freakin§A"

# not the desired outcome
replaceDash("jack-o-lantern")  # FAILS - should be "jack§o§lantern"
## [1] "jack§o-lantern"
replaceDash("Whack-a-Mole")    # FAILS - should be "Whack§a§Mole"
## [1] "Whack§a-Mole"

对于gsub()的第一个和第二个表达式,我需要什么正则表达式?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-28 21:35:46

您可以使用带有前瞻性的PCRE正则表达式,检查一个单词字符是否出现在连字符之后,但不会使用它。

代码语言:javascript
复制
replaceDash <- function(x) gsub("(\\w)-(?=\\w)", "\\1§", x, perl=T)

请参阅IDEONE演示

因此,(\\w)将字母数字符号捕获到第1组中,该符号随后在\\1反向引用的帮助下插入替换结果中,使用(?=\\w)我们只确保有一个单词字符,但是regex索引停留在连字符处,从而允许从该单词字符中进行下一次匹配。

票数 3
EN

Stack Overflow用户

发布于 2016-01-28 21:30:38

您没有指定允许使用哪种regex功能。下面是一种使用零的模式--看看周围:

代码语言:javascript
复制
gsub("(?<=\\w)-(?=\\w)", "§", "jack-o-lantern");
# jack§o§trade
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35072153

复制
相关文章

相似问题

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