我想知道有没有办法像这样分割文字:
123456789进入123-456-789
在每3个字符后添加“ - ”?
只是想知道,正如我所知道的那样,但如何做到这一点是我的头脑。 ;)
以及文字
ABCDEFGHI OR A1B2C3D4E or any other format
without any space between the characters !
languge : PHP only
答案 0 :(得分:4)
<?php
$i = '123456789';
echo 'result: ', wordwrap($i, 3, '-', true);
打印result: 123-456-789
答案 1 :(得分:2)
对于简单的字符串提取(特别是固定长度提取),我不是正则表达式的忠实粉丝,更喜欢稍微复杂的东西。几乎每种语言都有一个子字符串函数,因此,假设您的输入已经过验证,一个简单的(伪代码,因为您没有指定语言):
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
答案 2 :(得分:1)
为了完整性,这是一个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
。这不仅适用于数字,也适用于字母字符。
答案 3 :(得分:1)
我认为这可以在前瞻性的正则表达式中得到很好的理解:
s/(.{3})(?=.)/$1-/g
因为您在评论中提到了PHP:
preg_replace ("/(.{3})(?=.)/", "$1-", $string);
编辑:在VolkerK显示wordwrap
后,我在文档中找到了chunk-split
:
$new_string = chunk_split ($string, 3, '-');
这样做的好处是,当字符串中有空格时它也可以工作(wordwrap更喜欢在空格处断开)。
答案 4 :(得分:1)
另一个Python版本:
>>> x="123456789"
>>> out=[x[i:i+3] for i in xrange(0, len(x), 3)]
>>> print "-".join(out)
123-456-789
答案 5 :(得分:1)
对于任何语言:
答案 6 :(得分:0)
Perl:
#!/usr/bin/perl
use strict;
use warnings;
my $string = "123456789";
$string =~ /(\d{3})(\d{3})(\d+)/;
print "$1-$2-$3"
答案 7 :(得分:0)
您可以使用(以及其他方式)正则表达式匹配和替换。确切的语法取决于您使用的工具或编程语言。例如,在Perl中执行此操作的一种方法是
$a = "123456789";
$a =~ s/(\d{3})/$1-/g;
chop($a);
print $a;
第2行替换相同的3位数字和短划线的每3位数字。使用chop()我们删除尾随破折号。
这里还有另一个问题。当字符串不包含多个3位数字时该怎么办?如果允许这样的字符串,那么上面的代码片段需要修改。
此外,根据案例的具体情况,您可能会使用简单的子字符串替换或字符串切片。
答案 8 :(得分:0)
又一个Perl示例。这不会删除小于3的最终组,并且它会留下少于三位的初始组。它基于(非常无耻地) 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";