我想知道有没有办法在文本中添加中间字符串分隔符,如下所示:
123456789
进入123-456-789
基本上是每3个字符之间加一个“-”?
如果文字是
ABCDEFGHI
A1B2C3D4E
<?php
$i = '123456789';
echo 'result: ', wordwrap($i, 3, '-', true);
打印结果:123-456-789
我不太喜欢用于简单字符串提取(尤其是固定长度提取)的正则表达式,更喜欢用它们来处理稍微复杂的东西。几乎每种语言都有一个子字符串函数,因此,假设您的输入已经过验证,这是一个简单的(伪代码,因为您没有指定语言):
s = substring (s,0,3) + "-" + substring (s,3,3) + "-" + substring (s,6,3)
如果您想要每三个字符作为一个可变长度字符串(末尾有奇数大小):
t = ""
sep = ""
while s != "":
if s.len <= 3:
t = t + sep + s
s = ""
else:
t = t + sep + substring (s,0,3)
s = substring (s,3)
sep = "-"
s = t
对于任何语言:
为了完整起见,这里是一个Python解决方案:
>>> a = "123456789"
>>> a[0:3] + "-" + a[3:6] + "-" + a[6:9]
'123-456-789'
自从您更新问题以指定 PHP 解决方案以来,这应该可行:
substr($a, 0, 3) . "-" . substr($a, 3, 3) . "-" . substr($a, 6, 3)
substr
。这不仅适用于数字,也适用于字母字符。
另一个Python版本:
>>> x="123456789"
>>> out=[x[i:i+3] for i in xrange(0, len(x), 3)]
>>> print "-".join(out)
123-456-789
我认为这可以在具有前瞻功能的正则表达式中合理地完成:
s/(.{3})(?=.)/$1-/g
既然您在评论中提到了 PHP:
preg_replace ("/(.{3})(?=.)/", "$1-", $string);
编辑:VolkerK 显示
wordwrap
后,我在文档中找到了chunk-split
:
$new_string = chunk_split ($string, 3, '-');
这样做的好处是,当字符串中有空格时它也可以工作(自动换行更喜欢在空格处断开)。
在 Perl 中:
#!/usr/bin/perl
use strict;
use warnings;
my $string = "123456789";
$string =~ /(\d{3})(\d{3})(\d+)/;
print "$1-$2-$3"
您可以使用(除其他方式外)正则表达式匹配和替换来完成此操作。确切的语法取决于您使用的工具或编程语言。例如,在 Perl 中执行此操作的一种方法是
$a = "123456789";
$a =~ s/(\d{3})/$1-/g;
chop($a);
print $a;
第 2 行将每 3 位数字替换为相同的 3 位数字和破折号。使用 Chop() 我们删除尾随的破折号。
这里还有一个问题。当字符串不包含 3 倍数的数字时该怎么办?如果允许这样的字符串,那么上面的代码片段将需要修改。
此外,根据具体情况,您可能可以使用简单的子字符串替换或字符串切片。
再一个 Perl 示例。这不会删除小于三位数的最终组,并且会保留小于三位数的初始组。它基于(相当无耻地)Learning Perl(第 5 版第 212 页)中的“金钱数字”示例:
#!/usr/bin/env perl
use strict;
use warnings;
print "Gimme' a number: ";
chomp(my $number = <STDIN>);
1 while ($number =~ s/([0-9]{3})([0-9]+)/$1-$2/);
print "Now it's $number\n";