我有一个包含首字母缩略词的文本块。首字母缩略词都是用连字符写的,我想删除它,很可能用s /。诀窍是首字母缩略词可以是长字母A-B,A-B-C,A-B-C-D,A-B-C-D-E。
所以,如果我有一个字符串,欢迎参加B-A和R-C-T-C之间的U-S-A竞赛"我希望将它转换为"欢迎参加BA和RCTC之间的美国比赛",我该怎么做?像"良好的教练和#34;不应该受到影响。
到目前为止,我有三个s /首先替换所有四个字母的首字母缩略词,然后是三个,然后是两个。使用单个s /表达式有更好的方法吗?
谢谢!
答案 0 :(得分:2)
这是一个解决方案:
s/-(?=\p{Lu}\b)//g
这意味着:找一个破折号后面跟一个大写字母,这是一个单词边界。替换为空字符串。
这是一个笑脸友好的版本,在破折号的左边有相同的检查:
s/(?<=\b\p{Lu})-(?=\p{Lu}\b)//g
答案 1 :(得分:0)
您也可以使用此
s/(?<=[A-Z])-(?=[A-Z])//g
通过环视
轻松完成<强>解释强>
(?<=[A-Z])
:向后看,找到任何一个大写字母,
-
:匹配任何减号,
(?=[A-Z])
:展望未来,找到任何单一的大写字母。
最后,用零宽度字符替换-
。
答案 2 :(得分:0)
我试过了:
$sentence =~ s/([A-Z])\-/$1/g;
它似乎按预期工作(除了缺少小写首字母缩略词)。我有一个明显的问题,我错过了吗?感觉它应该像提供的答案更详细。谢谢!