Domanda

Voglio sapere c'è un modo per dividere il testo in questo modo:

123456789 in 123-456-789

come aggiungere " - " dopo ogni 3 caratteri?

Volevo solo sapere, poiché conosco il contrario, ma come fare è sopra la mia testa. ;)

e anche se il testo è

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

languge : PHP only
È stato utile?

Soluzione

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

vedi http://php.net/wordwrap

Altri suggerimenti

Non sono un grande fan dei regex per la semplice estrazione di stringhe (in particolare estrazioni a lunghezza fissa), preferendole per cose leggermente più complesse. Quasi ogni lingua ha una funzione di sottostringa, quindi, supponendo che il tuo input sia già stato convalidato, un semplice (pseudo-codice poiché non hai specificato una lingua):

s = substring (s,0,3) + "-" + substring (s,3,3) + "-" + substring (s,6,3)

Se lo vuoi ogni tre caratteri per una stringa di lunghezza variabile (con dimensione dispari alla fine):

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

Per qualsiasi lingua:

  • Crea una variabile stringa vuota chiamata " risultato "
  • Crea una variabile contatore intero, " i " ;, che aumenta fino alla lunghezza della stringa originale (quella con il numero)
  • Aggiungi ogni carattere della stringa originale a " risultato "
  • Se i modulo 3 (di solito% o mod) è zero, aggiungi un trattino a " risultato "

Nell'interesse della completezza, ecco una soluzione Python:

>>> a = "123456789"
>>> a[0:3] + "-" + a[3:6] + "-" + a[6:9]
'123-456-789'

Poiché hai aggiornato la tua domanda per specificare una soluzione PHP, dovrebbe funzionare:

substr($a, 0, 3) . "-" . substr($a, 3, 3) . "-" . substr($a, 6, 3)

Vedi substr per maggiori informazioni su questa funzione. Questo funzionerà non solo per le cifre, ma anche per i caratteri alfabetici.

Ancora un'altra versione di Python:

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

Penso che questo possa essere fatto in modo sano in una regex con lookahead:

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

Da quando hai citato PHP in un commento:

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

modifica : dopo che VolkerK ha mostrato wordwrap , ho trovato chunk-split nella documentazione:

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

Questo ha il vantaggio che funziona anche quando ci sono spazi nella stringa (wordwrap preferirebbe spezzarsi negli spazi).

In Perl:

#!/usr/bin/perl

use strict;
use warnings;

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

print "$1-$2-$3"

Puoi farlo con (tra l'altro) una corrispondenza e una sostituzione di espressioni regolari. La sintassi esatta dipende dallo strumento o dal linguaggio di programmazione che si sta utilizzando. Ad esempio, un modo per farlo in Perl sarebbe

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

La riga 2 sostituisce ogni 3 cifre per le stesse 3 cifre e un trattino. Con chop () eliminiamo il trattino finale.

C'è un'altra domanda qui. Cosa fare quando la stringa non contiene un multiplo per 3 quantità di cifre? Se tali stringhe fossero consentite, lo snippet sopra riportato dovrebbe essere modificato.

Inoltre, a seconda delle specifiche del caso, potresti cavartela con la semplice sostituzione della sottostringa o l'affettatura delle stringhe.

Un altro esempio di Perl. Ciò non rimuove i gruppi finali più piccoli di tre e lascia solo i gruppi iniziali di meno di tre cifre. Si basa (piuttosto spudoratamente) sui "numeri di denaro" esempio in Learning Perl (pagina 212 del 5 ° ed.):

#!/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";
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top