如何从这样的字符串中删除带有破折号(作为前缀或后缀)的单词:
x <- "word -o -dod -3 -33 dp-pd -d- --- 140 -- s- S- SS- s3- 3e- 33- 3- s SS avf-ada"
获得:
word dp-pd 140 s SS avf-ada
有时,也可以删除独立短划线。
感谢regex101:(\s-\S+)|(\S+-\s)
答案 0 :(得分:1)
我建议使用
x <- "word -o -dod -3 -33 dp-pd -d- --- 140 -- s- S- SS- s3- 3e- 33- 3- s SS avf-ada -"
trimws(gsub("(?:\\S+-\\B|\\B-\\S+|\\B-\\B)\\s*", "", x, perl=TRUE))
请参阅regex demo和R demo。
<强>详情:
(?:\S+-\B|\B-\S+|\B-\B)
- 两种选择中的任何一种:
\S+-\B
- 除了空格,-
和非字边界之外的1 +个字符,也就是说,-
必须位于字符串的末尾或非字符之前字char |
- 或\B-\S+
- 一个非单词边界,也就是说,-
只有在前面带有非单词字符或字符串的开头,然后是连字符和1 +以外的字符时才匹配空白\B-\B
- 包含非字边界的任何-
(在字符串的结尾/开头或非字字符之间)\s*
- 0+空格。由于非字边界无法与TRE正则表达式版本一起使用,因此需要使用perl=TRUE
。