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
Soluzione
<?php
$i = '123456789';
echo 'result: ', wordwrap($i, 3, '-', true);
stampe result: 123-456-789
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";