拆分文字

时间:2009-06-20 11:08:52

标签: php regex text split

我想知道有没有办法像这样分割文字:

123456789进入123-456-789

在每3个字符后添加“ - ”?

只是想知道,正如我所知道的那样,但如何做到这一点是我的头脑。 ;)

以及文字

ABCDEFGHI OR A1B2C3D4E or any other format 
without any space between the characters !

languge : PHP only

9 个答案:

答案 0 :(得分:4)

<?php
$i = '123456789';
echo 'result: ', wordwrap($i, 3, '-', true);
打印
result: 123-456-789

请参阅http://php.net/wordwrap

答案 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)

对于任何语言:

  • 创建一个名为“result”的空字符串变量
  • 创建一个整数计数器变量“i”,该变量递增直到原始字符串的长度(带有数字的字符串)
  • 将原始字符串中的每个字符附加到“结果”
  • 如果i modulo 3(通常是%或mod)为零,请在“结果”附加一个短划线

答案 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";