Perl:删除较长字符串中的首字母缩写连字符

时间:2015-08-21 23:00:28

标签: regex perl

我有一个包含首字母缩略词的文本块。首字母缩略词都是用连字符写的,我想删除它,很可能用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 /表达式有更好的方法吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

这是一个解决方案:

s/-(?=\p{Lu}\b)//g

Demo

这意味着:找一个破折号后面跟一个大写字母,这是一个单词边界。替换为空字符串。

这是一个笑脸友好的版本,在破折号的左边有相同的检查:

s/(?<=\b\p{Lu})-(?=\p{Lu}\b)//g

Demo

答案 1 :(得分:0)

您也可以使用此

s/(?<=[A-Z])-(?=[A-Z])//g

通过环视

轻松完成

<强>解释

(?<=[A-Z]):向后看,找到任何一个大写字母,

-:匹配任何减号,

(?=[A-Z]):展望未来,找到任何单一的大写字母。

最后,用零宽度字符替换-

答案 2 :(得分:0)

我试过了:

$sentence =~ s/([A-Z])\-/$1/g;

它似乎按预期工作(除了缺少小写首字母缩略词)。我有一个明显的问题,我错过了吗?感觉它应该像提供的答案更详细。谢谢!