2010-12-02 11 views
4

Ich habe eine Zeichenfolge, die an Wochentagen und Öffnungszeiten enthält, wie teile ich diese in Zeilen mit einem Regex-Ausdruck? Ein Beispiel für eine Zeichenfolge ist:Wie spalte ich zwischen Zahlen und Zeichen mit Regex?

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

ich zwischen einem unteren Buchstaben und einer Zahl geteilt werden soll, und zwischen einer Zahl und einem Großbuchstaben

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

Vielen Dank im Voraus!

+1

welche sprache? Python, Rubin, Sed? – Peter

+0

Jemand bitte formatieren seinen Code :) – jordanbtucker

+3

@Peter - sieht aus wie Schwedisch. – eumiro

Antwort

8

Split auf

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

Zum Beispiel in C#:

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

oder in PHP:

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

oder in Java:

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

oder in Perl:

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

Danke! Das funktioniert! Ich wusste nicht, dass die Programmiersprache relevant war. Ich dachte, Regex sei in jeder Sprache Regex. Wie auch immer, die Sprache ist Java. Zuerst habe ich es mit der regulären Musterklasse versucht, aber das hat nicht funktioniert, aber die Zeile, die du geschrieben hast, hat funktioniert! Vielen Dank. – Magnus

+0

@Magnus: Es gibt Syntaxunterschiede, Unterschiede in den Funktionen und Implementierungsunterschiede - zwei Regex-Varianten sind nicht identisch. Die obige Regex würde zum Beispiel in Python nicht funktionieren - keine Unicode-Eigenschaften und keine Aufspaltung bei Übereinstimmungen der Länge Null. Noch in JavaScript - kein Lookbehind. Sie könnten übrigens "\ d" durch "\ p {N}" ersetzen, um Konsistenz zu gewährleisten. –

+0

Danke! Irgendeine Idee wo ich mehr über Regex lernen kann? Ich wusste nicht, was es vor 6 Stunden war, aber jetzt kann ich das Potenzial sehen :-) – Magnus

0

Wenn Sie ([a-z])(\d) und ersetzen Sie es mit $1\n$2 suchen sollte es funktionieren, aber ohne Ihre Programmiersprache und Umgebung zu kennen, ist es schwer zu geben Sie eine direkte Antwort.

2

Wenn und nur wenn eine Nummer ein Codepunkt mit der \pN Eigenschaft ist, als ein nonnumber jeder Codepunkt ist die Eigenschaft fehlt, die man \PN für schreibt.

Einige regex Dialekte pusillanimiously darauf bestehen, diejenigen zu umfassen, wie \p{N} oder \P{N} - was ist Koje, aber Sie sind ein Gefangener der Launen und Schwächen, Ihrer Sprachlosigkeit oder Ignoranz.

In diesen Regex-Dialekten einer besser lesbaren Form können Sie diese in einer liberaleren und besser lesbaren Weise schreiben, wie \p{Number} bzw. \P{Number}.

Wenn Sie eine Dezimalzahl bedeuten, die nicht das gleiche wie eine Zahl ist, können Sie schreiben, dass als \p{Nd}, mit seinem Komplement daher \P{Nd}. Die lesbare Version davon ist \p{Decimal_Number} und \P{Decimal_Number}. In einigen Programmiersprachen steht dafür die Abkürzung für Regex Convenience.

Es gibt vier allgemeine Kategorien Zahlen bezogen werden:

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

und es gibt zahlreiche andere Kategorien Zahlen bezogen werden:

 
    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. . .Für welche Art von "Zahlen" warst du gerade interessiert? :)

+1

+1 für die Verwendung des Wortes pusillanimously, um regex Dialekte zu beschreiben. – James

Verwandte Themen