我想知道有没有办法可以像这样分割文本:

123456789 转 123-456-789

每3个字符后加“-”?

只是想知道,因为我知道相反的情况,但如何做到这一点超出了我的能力。;)

并且如果文本是

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

languge : PHP only
有帮助吗?

解决方案

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

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

其他提示

对于简单的字符串提取(特别是固定长度提取),我不是正则表达式的忠实粉丝,更喜欢稍微复杂的东西。几乎每种语言都有一个子字符串函数,因此,假设您的输入已经过验证,一个简单的(伪代码,因为您没有指定语言):

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

对于任何语言:

  • 创建一个名为“result”的空字符串变量
  • 创建一个整数计数器变量“i”,它会递增,直到达到 原来的 字符串(带有数字的字符串)
  • 将原始字符串中的每个字符附加到“结果”
  • 如果 i 模 3(通常是 % 或 mod)为零,则在“结果”后附加破折号

为了完整性,这是一个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, '-');

这样做的好处是,当字符串中有空格时它也可以工作(wordwrap更喜欢在空格处断开)。

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示例。这不会删除小于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";
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top