Вопрос

Я хочу знать, есть ли способ разделить текст следующим образом:

123456789 на 123-456-789

как добавить "-" после каждых трёх символов?

Просто хотел узнать, так как знаю обратное, но как это сделать - выше головы.;)

а также, если текст

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», которая увеличивается до тех пор, пока не достигнет длины оригинальный строка (та, что с номером)
  • Добавьте каждый символ из исходной строки в «результат».
  • Если я по модулю 3 (обычно % или мод) равен нулю, добавьте тире к «результату».

В интересах полноты, вот решение 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

Я думаю, что это может быть разумно сделано в регулярном выражении с помощью lookahead:

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

Поскольку вы упомянули PHP в комментарии:

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

edit . После того, как VolkerK показал wordwrap , я обнаружил разбиение на фрагменты в документации:

$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. Это не удаляет конечные группы, меньшие трех, и оставляет только начальные группы менее трех цифр. Он основан (довольно беззастенчиво) на «денежных числах» пример в Изучение Perl (стр. 212 из 5-го издания):

#!/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