在字符串中的 N 个字符集之间插入分隔符

问题描述 投票:0回答:9

我想知道有没有办法在文本中添加中间字符串分隔符,如下所示:

123456789
进入
123-456-789

基本上是每3个字符之间加一个“-”?

如果文字是

  • ABCDEFGHI
  • A1B2C3D4E
  • 或任何其他字符之间没有空格的格式
php regex delimiter
9个回答
4
投票

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

参见 http://php.net/wordwrap


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

1
投票

对于任何语言:

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

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
。这不仅适用于数字,也适用于字母字符。


1
投票

另一个Python版本:

>>> x="123456789"
>>> out=[x[i:i+3] for i in xrange(0, len(x), 3)]
>>> print "-".join(out)
123-456-789

1
投票

我认为这可以在具有前瞻功能的正则表达式中合理地完成:

s/(.{3})(?=.)/$1-/g

既然您在评论中提到了 PHP:

preg_replace ("/(.{3})(?=.)/", "$1-", $string);

编辑:VolkerK 显示

wordwrap
后,我在文档中找到了
chunk-split

$new_string = chunk_split ($string, 3, '-');

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


0
投票

在 Perl 中:

#!/usr/bin/perl

use strict;
use warnings;

my $string = "123456789";
$string =~ /(\d{3})(\d{3})(\d+)/;

print "$1-$2-$3"

0
投票

您可以使用(除其他方式外)正则表达式匹配和替换来完成此操作。确切的语法取决于您使用的工具或编程语言。例如,在 Perl 中执行此操作的一种方法是

$a = "123456789";
$a =~ s/(\d{3})/$1-/g;
chop($a);
print $a;

第 2 行将每 3 位数字替换为相同的 3 位数字和破折号。使用 Chop() 我们删除尾随的破折号。

这里还有一个问题。当字符串不包含 3 倍数的数字时该怎么办?如果允许这样的字符串,那么上面的代码片段将需要修改。

此外,根据具体情况,您可能可以使用简单的子字符串替换或字符串切片。


0
投票

再一个 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";
© www.soinside.com 2019 - 2024. All rights reserved.