2010-12-02 4 views
4

J'ai une chaîne contenant les jours de la semaine et les heures d'ouverture, comment les diviser en lignes en utilisant une expression regex? Un exemple d'une chaîne est:Comment séparer des nombres et des caractères avec regex?

Mån - Tor6:30 - 22:00Fre6:30 - 20:00Lör9:00 - 18:00Sön10:00 - 19:00 

Je veux partager entre une lettre minuscule et un certain nombre, et entre un numéro et une lettre majuscule

Mån - Tor 
6:30 - 22:00 
Fre 
6:30 - 20:00 
Lör 
9:00 - 18:00 
Sön 
10:00 - 19:00 

Merci à l'avance!

+1

quelle langue? python, ruby, sed? – Peter

+0

Quelqu'un s'il vous plaît formater son code :) – jordanbtucker

+3

@Peter - ressemble à suédois. – eumiro

Répondre

8

Split

(?<=\d)(?=\p{L})|(?<=\p{L})(?=\d) 

Par exemple, en C#:

splitArray = Regex.Split(subjectString, @"(?<=\d)(?=\p{L})|(?<=\p{L})(?=\d)"); 

ou en PHP:

$result = preg_split('/(?<=\d)(?=\p{L})|(?<=\p{L})(?=\d)/u', $subject); 

ou en Java:

String[] splitArray = subjectString.split("(?<=\\d)(?=\\p{L})|(?<=\\p{L})(?=\\d)"); 

ou en Perl:

@result = split(m/(?<=\d)(?=\p{L})|(?<=\p{L})(?=\d)/, $subject); 
+0

Merci! Cela marche! Je ne savais pas que le langage de programmation était pertinent. Je pensais regex était regex dans n'importe quelle langue. De toute façon, la langue est Java. J'ai d'abord essayé la classe regex, mais cela n'a pas fonctionné, mais la ligne que vous avez écrite a fonctionné! Merci. – Magnus

+0

@Magnus: Il existe des différences de syntaxe, des différences de fonctionnalités et des différences de mise en œuvre - il n'y a pas deux goûts regex identiques. L'expression régulière ci-dessus, par exemple, ne fonctionnerait pas en Python - pas de propriétés Unicode, et pas de fractionnement sur les correspondances de longueur nulle. Ni en JavaScript - pas de lookbehind. Vous pouvez, en passant, remplacer '\ d' par' \ p {N} 'pour la cohérence. –

+0

Merci! Une idée où je peux en apprendre plus sur regex? Je ne savais pas ce que c'était il ya 6 heures, mais maintenant je peux voir le potentiel :-) – Magnus

0

Si vous recherchez ([a-z])(\d) et le remplacer par $1\n$2 il devrait fonctionner, mais sans connaître votre langage de programmation et de l'environnement, il est difficile de vous donner une réponse directe.

2

Si et seulement si un nombre est un point de code avec la propriété \pN, qu'un nonnumber est un point quelconque de code manquant ladite propriété, que l'on écrit pour \PN.

Certains dialectes regex insistent sur lâchement embrasser ceux-ci, comme \p{N} ou \P{N} - qui est superposé, mais vous êtes prisonnier des caprices et des manies, des insécurités ou l'ignorance de votre concepteur de langage.

Dans ces dialectes regex d'un penchant plus lisible, vous pouvez écrire ceux d'une façon plus libérale et plus lisible, comme \p{Number} et \P{Number}, respectivement.

Si vous voulez dire un nombre décimal , qui est pas le même numéro, vous pouvez écrire que \p{Nd}, avec son complément \P{Nd} donc. La version lisible de ceux-ci est \p{Decimal_Number} et \P{Decimal_Number}. Dans certains langages de programmation, c'est ce que signifie l'abréviation de regex \d.

Il existe quatre catégories générales relatives aux numéros:

 N   Number 
     Nd   Decimal_Number (also Digit) 
     Nl   Letter_Number 
     No   Other_Number 

et il y a de nombreuses autres catégories liées aux numéros:

 
    Alnum         InCommonIndicNumberForms     Numeric_Type:Numeric      Numeric_Value:18       Numeric_Value:38       Numeric_Value:400      Numeric_Value:60000 
    Bidi_Class:Arabic_Number     InCountingRodNumerals     Numeric_Value:0       Numeric_Value:19       Numeric_Value:39       Numeric_Value:500      Numeric_Value:70000 
    Bidi_Class:European_Number    InCuneiformNumbersAndPunctuation   Numeric_Value:NaN      Numeric_Value:20       Numeric_Value:40       Numeric_Value:600      Numeric_Value:80000 
    Block:Aegean_Numbers      InEnclosedAlphanumerics     Numeric_Value:1       Numeric_Value:21       Numeric_Value:41       Numeric_Value:700      Numeric_Value:90000 
    Block:Ancient_Greek_Numbers    InEnclosedAlphanumericSupplement   Numeric_Value:2       Numeric_Value:22       Numeric_Value:42       Numeric_Value:800      Numeric_Value:100000 
    Block:Common_Indic_Number_Forms   InMathematicalAlphanumericSymbols  Numeric_Value:3       Numeric_Value:23       Numeric_Value:43       Numeric_Value:900      Numeric_Value:100000000 
    Block:Counting_Rod_Numerals    InNumberForms       Numeric_Value:4       Numeric_Value:24       Numeric_Value:44       Numeric_Value:1000      Numeric_Value:1000000000000 
    Block:Cuneiform_Numbers_And_Punctuation InRumiNumeralSymbols      Numeric_Value:5       Numeric_Value:25       Numeric_Value:45       Numeric_Value:2000      Other_Number 
    Block:Enclosed_Alphanumeric_Supplement Letter_Number       Numeric_Value:6       Numeric_Value:26       Numeric_Value:46       Numeric_Value:3000      PosixAlnum 
    Block:Enclosed_Alphanumerics    Line_Break:Infix_Numeric     Numeric_Value:7       Numeric_Value:27       Numeric_Value:47       Numeric_Value:4000      Sentence_Break:Numeric 
    Block:Mathematical_Alphanumeric_Symbols Line_Break:Numeric      Numeric_Value:8       Numeric_Value:28       Numeric_Value:48       Numeric_Value:5000      Word_Break:ExtendNumLet 
    Block:Number_Forms      Line_Break:Postfix_Numeric    Numeric_Value:9       Numeric_Value:29       Numeric_Value:49       Numeric_Value:6000      Word_Break:MidNum 
    Block:Rumi_Numeral_Symbols    Line_Break:Prefix_Numeric    Numeric_Value:10       Numeric_Value:30       Numeric_Value:50       Numeric_Value:7000      Word_Break:MidNumLet 
    Decimal_Number       Number         Numeric_Value:11       Numeric_Value:31       Numeric_Value:60       Numeric_Value:8000      Word_Break:Numeric 
    General_Category:Decimal_Number   Numeric_Type:De       Numeric_Value:12       Numeric_Value:32       Numeric_Value:70       Numeric_Value:9000      XPosixAlnum 
    General_Category:Letter_Number   Numeric_Type:Decimal      Numeric_Value:13       Numeric_Value:33       Numeric_Value:80       Numeric_Value:10000      
    General_Category:Number     Numeric_Type:Di       Numeric_Value:14       Numeric_Value:34       Numeric_Value:90       Numeric_Value:20000      
    General_Category:Other_Number   Numeric_Type:Digit      Numeric_Value:15       Numeric_Value:35       Numeric_Value:100      Numeric_Value:30000      
    InAegeanNumbers       Numeric_Type:None      Numeric_Value:16       Numeric_Value:36       Numeric_Value:200      Numeric_Value:40000      
    InAncientGreekNumbers     Numeric_Type:Nu       Numeric_Value:17       Numeric_Value:37       Numeric_Value:300      Numeric_Value:50000  

So. . .Quel genre de «nombres» vous intéressait-il? :)

+1

+1 pour utiliser le mot pusillanimously pour décrire les dialectes regex. – James

Questions connexes