如何在字母字符和数字字符之间插入空格?

3
这是我原来的问题的继续:Perl- 如何在每个大写字母前插入一个空格,但除了第一次出现或已存在之外?

我能够实现在字符串中仅包含字母的情况下,在大写字母之间插入空格:

my $camel ="SomeCamel IsEnteringText";
$camel =~ s/(?<=[a-z])(?=[A-Z])/ /g;
$camel =~ s/([^[:space:]]+)/\u$1/g;

打印:

一些骆驼正在输入文本

但是,当数字出现时,我遇到了问题:

my $camel ="Some 440Camel220 IsEntering100Text Nogo";
$camel =~ s/(?<=[a-z])(?=[A-Z])/ /g;
$camel =~ s/([^[:space:]]+)/\u$1/g;

输出:

一些440Camel220正在输入100Text Nogo

期望:

一些 440 Camel 220 正在输入 100 Text Nogo

那么,我该如何在字母和数字之间插入空格呢?

3个回答

3

将第一个替换项更改为:

$camel =~ s/(?<=[a-z])(?=[A-Z0-9])|(?<=[0-9])(?=[A-Z])/ /g;

另请参阅Perl正则表达式文档


我选择这个作为答案,因为我只需要用两行代码而不是四行就能得到我想要的结果。虽然我必须承认,我还在努力弄清楚其中发生了什么! - DulcimerDude
他基本上做的和我的答案一样。分组的前半部分(由|分隔)匹配小写字母和大写字母或数字之间的转换,后半部分匹配数字和大写数字之间的转换。这个版本不会将a440转换为a 440;而我的会。我不知道这是否重要。我还认为最外层的(?:...)是不必要的。实际上,在这个表达式中它什么也没做。 - Matt K
我必须花一些时间来理解这个。虽然我有点明白了。我要去玩一下,直到我真的能够自己写一个(不仅仅是单个字符的替换)!再次感谢你... - DulcimerDude
@Matt:是的,分组是不必要的。从正则表达式中移除它。 - Eugene Yarmash

0

添加以下两个替换:

$camel =~ s/(?<=[0-9])(?=[a-z])/ /ig;
$camel =~ s/(?<=[a-z])(?=[0-9])/ /ig;

第一个在数字和字母之间的任何转换处插入一个空格。末尾的i修饰符使表达式不区分大小写。第二个则相反。

谢谢,很有效,并且我能够理解发生了什么。我希望我可以选择你和Eugene Y的回答,因为它们对我来说都很有价值。 - DulcimerDude

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接