基于以下字符串
{EP03-C18} - {EP03-C19}
我可以使用\{(.*?)\}
选择大括号中的值
但我怎样才能只选择-
以获取类似{EP03C18} - {EP03C19}
答案 0 :(得分:3)
如果您的字符串具有均衡的未使用{...}
,您可以使用
s = "{EP03-C18} - {EP03-C19}"
gsub("-(?=[^{}]*})", "", s, perl=TRUE)
## => [1] "{EP03C18} - {EP03C19}"
-(?=[^{}]*})
模式与-
匹配,后跟0 {+ 1}}和{
以外的0 +字符,然后是}
。由于}
是预测,因此匹配的文字不会添加到匹配值中,您可以使用正则表达式删除(?=...)
内的任意数量的-
。
如果您的字符串较多且包含大量未配对的{...}
和{
,则使用}
会更安全:
gsubfn
<强>详情
library(gsubfn)
gsubfn("{[^{}]+}", ~ gsub("-","",x,fixed=TRUE), s)
## => [1] "{EP03C18} - {EP03C19}"
- 匹配{
{
- 除[^{}]+
和{
以外的一个或多个字符}
- }
}
- 删除匹配中的所有gsub("-","",x,fixed=TRUE)
。答案 1 :(得分:2)
你可以使用lookaheads在大括号内查找破折号:
gsub("-(?=[^{}]*})", "", "{EP03-C18} - {EP03-C19}", perl=TRUE)
输出:
[1] "{EP03C18} - {EP03C19}"
然而,这假设所有牙箍均衡。
<强> Live demo 强>
故障:
-
匹配短划线(?=
开始积极前瞻
[^{}]*}
如果它遇到一个右大括号(没有跳过大括号))
前瞻结束答案 2 :(得分:0)
答案 3 :(得分:0)
您可以使用以下正则表达式进行搜索,并使用空字符串替换。
(?<=\{\w+)-
它使用正向lookbehind来确保 - 字符位于一个开口大括号之后。
如果您使用的正则表达式包不支持lookbehinds,您可以使用以下正则表达式进行搜索并替换为捕获组1。
(\{\w+)-