Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: bikerboy am 15.01.08 - 17:44:49

Titel: Telefonnummern Parsen
Beitrag von: bikerboy am 15.01.08 - 17:44:49
Hi,

ich soll einen Telefonparser bauen, finde aber kaum Dinge im Netz an denen ich mich orientieren kann.

Also wie sieht es aus mit Regeln und dergleichen. Habt ihr da schon Erfahrungen ? vllt sogar fertigen Code ? Bin über alles glücklich was ihr mir zuwerft
Titel: Re: Telefonnummern Parsen
Beitrag von: eknori am 15.01.08 - 17:48:40
Wen wir dir Output geben sollen, musst du uns aber auch ein bisschen mehr Input liefern.

Vom @Formel über LotusScript und JavaScript ( RegexP ) ist da so ziemlich alles drin. Mit Sicherheit hat Axel Janssen für Java auch noch was in der Schublade ...
Titel: Re: Telefonnummern Parsen
Beitrag von: koehlerbv am 15.01.08 - 17:55:03
(Brauchbaren) fertigen Code wird hier kaum jemand veröffentlichen, aber mit Tipps stehen wir sicherlich gerne zur Verfügung. Ich zum Beispiel habe schon viel auf diesem Gebiet gemacht.

Hast Du konkrete Fragen? Wie sieht Dein Ausgangsmaterial aus?
Willst Du aus
Zitat
0172 4711 0815
eine gültige Nummer machen wie
Zitat
004917247110815?
Oder feststellen, dass dies keine gültige Nummer ist (die letzte "5" ist zuviel)?

Hast Du Probleme mit Nummern wie
Zitat
0172-4711-815 (nur privat!)
oder
Zitat
Serverraum: 08662 012100

Einfach wäre auch noch, folgende Nummer zu wandeln:
Zitat
+45 (0) 1234 567
(By the way: Dänemark kennt für inländische (Fern-)Gespräche keine führende Null, aber das nur so am Rande ...


Oder muss Du gar aus so was Nummern herausflöhen?
Zitat
RADIO CHIEMGAU

Programmanbieter GmbH & Co.
Rupertistraße 40-42
83278 Traunstein

Handelsregister Traunstein HRA 5644

persönlich haftende Gesellschafterin:
RADIO CHIEMGAU
Programmanbieter GmbH & Co.
Programmanbieter Verwaltungs GmbH

Geschäftsführer: Andi Nickl

Telefon Verwaltung: +49 861 98 63 6-0
Fax Verwaltung: +49 861 14 110
eMail: info@radio-chiemgau.de
   
Telefon Marketing: + 49 861 98 63 6-14
Fax Marketing: + 49 861 86 02
eMail: marketing@radio-chiemgau.de

Wie Ulrich schon schrieb: Mehr Input, mehr Output.

Bernhard
Titel: Re: Telefonnummern Parsen
Beitrag von: flaite am 15.01.08 - 19:05:11
Mit Sicherheit hat Axel Janssen für Java auch noch was in der Schublade ...
Ich? Schublade. Regular Expressions?
Hätt ich gerne.
Immer wenn ich dabei war, da ein bischen fixer zu werden, war die Projekt-Aufgabe zu Ende. Seit 5 Jahren.
Das selbe Spiel mit xslt. 
Könnt ich mal machen für das Telefonnummernbeispiel.
Hmm. Sollte noch eine LS2J Umgebung für mein Mock-Framework bauen.

Warte auf Requirements. Bernhard hat schon ein paar gute Beispiele genannt.
Der deklarative Ansatz mit Regular Expressions ist wohl vom Ansatz her überlegen, d.h. man erzielt mit wenig Code gute Ergebnisse.

Titel: Re: Telefonnummern Parsen
Beitrag von: ata am 15.01.08 - 21:13:08
... da wäre ich auch hellhörig  ;D

Toni
Titel: Re: Telefonnummern Parsen
Beitrag von: bikerboy am 16.01.08 - 09:35:44
Also , ich arbeite hier mit einem Datenmigrationstool und habe eine CSV-Datei liegen aus der ich mir komplette Adressen herausziehe,Ich bekomme die Nummer einzeln und muss sie nicht aufwendig suchen.

Die Herrausforderung besteht darin, dass ich sie für meine Applikation in 4 Felder unterteilen soll.

1. Ländervorwahl

2. Vorwahl

3. Hauptnummer

4. Durchwahl

So  nun gibt es ja in viel Möglichkeiten wie so eine NUmmer aussehen kann.

ob sie nun mit 0, 00 , +49 anfängt bis dahin ist die Nummer ob die Vorwahl nun  oder 4 stellen hat.


Ich habe bis jetzt ein Tool das erstmal alle Sonderzeichen rausschmeisst und sie durch Leerzeichen ersetzt, dann bilden sich Blöcke die ich untersuche, der erste Block ist ja die VOrwahl oder vllt auchs chon die Länderkennzeichnung, und dann versuche ich die weiter zubauen,

Bis Jetzt kann ich zum Beispiel aus 052741660

+49 5274 / 166 - 0

aber es gibt da noch einige Probleme mit nummern die nur 3 zeichen in der Vorwahl hat
Titel: Re: Telefonnummern Parsen
Beitrag von: MadMetzger am 16.01.08 - 09:48:44
Haben die Telefon-nummern denn ein bestimmtes Format, aus dem du konvertieren willst? Oder lässt sich das auf bestimmte Formatierungen einschränken?
Titel: Re: Telefonnummern Parsen
Beitrag von: m3 am 16.01.08 - 09:53:37
Liste der Länder-Vorwahlen:
http://www.kropla.com/dialcode.htm
http://en.wikipedia.org/wiki/List_of_country_calling_codes

Damit sollten sich +43, 0043, etc. herausfiltern lassen.

Und auf
http://www.bundesnetzagentur.de/enid/1c8898cd0fe8ca657dc567bbdf5d5a62,0/Verzeichnisse/Losgroe_enverzeichnis_ONB_1gi.html
gibts ein Verzeichnis aller Ortsvorwahlen Deutschlands, damit solltest Du auch diese eigentlich erkennen können.
Titel: Re: Telefonnummern Parsen
Beitrag von: flaite am 16.01.08 - 10:31:37
Das spannende an dem Parser (find ich) besteht gerade darin, dass er robust auf eine möglichst große Variabilität reagiert, die sich Anwender ausdenken.
Also er sollte.
+49 (0)233 644480
00492333644480
0223464480
0 22 34 6 44 80
02234 64480
alle klaglos verarbeiten können.

Hier gibts auch ein paar Beispiele und Ansatzpunkte für eine solche RegEx, die man vermutlich so in Java kopieren könnte und absolut LS2J fähig wäre, also in LotusScript code wie QuerySave einbindbar ist. 
http://regexlib.com/DisplayPatterns.aspx?categoryId=7&cattabindex=2

Gruß Axel
Titel: Re: Telefonnummern Parsen
Beitrag von: diali am 16.01.08 - 11:03:12
es gibt für die Telefonnummern ein kanonisches Format, welches auch CTI-Anwendungen verwenden. Der Aufbau ist wie folgt:
+[Landeskennzahl] ([Ortsnetzkennzahl]) [Rufnummer]
* zwischen Landeskennzahl, Ortskennzahl und Rufnummer muss jeweils ein Leerzeichen stehen
* die Ortsnetzkennzahl muss ohne führende Null eingetragen werden

siehe auch Wikipedia (http://de.wikipedia.org/wiki/Internationales_Nummernformat), wobei die nichts von den Klammern wissen. Bei unserer Anlagensoftware ist in der Doku die Klammer erwähnt.
Titel: Re: Telefonnummern Parsen
Beitrag von: bikerboy am 16.01.08 - 15:02:19
Ich freue mich über die rege Beteiligung,

@Axel genauso sollte es sein, man einfach eine Nummer reingeben und parst sie dann ins richtige Format, zwar ist es in dem Konkreten Beipspiel fast immer passend, aber halt nicht immer. Und kann ich den Code ja auch in anderen Anwendungen zur Anwendung kommen lassen.(Dürfte im Sinne von Bernhardt sein )

Titel: Re: Telefonnummern Parsen
Beitrag von: bikerboy am 16.01.08 - 17:47:40
hier ein erster Versuch :


Code
Sub Click(Source As Button)
	
	Dim ws As New NotesUIWorkspace
	Dim Proc As NotesDocument
	
	Set Proc = ws.CurrentDocument.Document
	
	Dim Phone List As String
	Dim findArray(9) As String
	Dim replaceArray(9) As String
	Dim strArea As String
	Dim strCountry As String
	Dim strLine As String
	Dim strExtension As String
	
	Dim strCheckArea As String
	Dim strCheckLine As String
	Dim strCheckNewArea As String
	Dim strCheckNewLine As String
	Dim strCheckCountry As String
	Dim strCheckNewCountry As String
	
	Dim intLengthComplete As Integer
	Dim intLengthLastPart As Integer
	
	findArray(0) = " "    
	findArray(1) = "/"
	findArray(2) = "\"
	findArray(3) = "-"
	findArray(4) = "("
	findArray(5) = ")"
	findArray(6) = "|"	
	findArray(7) = "~"
	findArray(8) = "#"
	findArray(9) = "'"
	
	replaceArray(0) = " "
	replaceArray(1) = " "
	replaceArray(2) = " "
	replaceArray(3) = " "
	replaceArray(4) = " "
	replaceArray(5) = " "
	replaceArray(6) = " "
	replaceArray(7) = " "
	replaceArray(8) = " "
	replaceArray(9) = " "
	
	
	tmpPhone = Replace(Proc.ParserFieldComplete(0),findArray , replaceArray)
	
	DelimCount = 1
	
	Erase Phone
	
	If tmpPhone <> "" Then
		varPhone = Split(tmpPhone, " ")
		
		If Ubound(varPhone) = 0 Then
			
			strCountry = Left(varPhone(0),1)
			
			If strCountry = "+" Then 
				Proc.ParserFieldCountry= Left(varPhone(0),3)
			Else
				Proc.ParserFieldCountry= Left(varPhone(0),1)
			End If
			
			intLenthComplete = Len(varPhone(0))
			intLengthLastPart = Len(Proc.ParserFieldCountry(0))
			
			varPhone(0) = Right(varPhone(0),(intLenthComplete  - intLengthLastPart))
			strArea = Left(varPhone(0),4)
			
			Proc.ParserFieldArea = strArea
			
			intLengthLastPart = Len(Proc.ParserFieldArea(0))
			intLenthComplete = Len(varPhone(0))
			varPhone(0) = Right(varPhone(0),(intLenthComplete  - intLengthLastPart))
			
			strExtensionCheck = Right(varPhone(0),1)
			
			If strExtensionCheck = "0" Then
				Proc.ParserFieldLine = Left(varPhone(0),Len(varPhone(0))-1)
				Proc.ParserFieldExtension = Right(varPhone(0),1)
			Else
				Proc.ParserFieldLine = varPhone(0)
			End If
			
		Elseif Ubound(varPhone) = 1 Then
			
			Call Proc.ReplaceItemValue("ParserFieldCountry",varPhone(0))
			Call Proc.ReplaceItemValue("ParserFieldArea", Left(varPhone(1),4))
			Call Proc.ReplaceItemValue("ParserFieldLine",Right(varPhone(1),Len(varPhone(1))-4))
			If Right(Proc.ParserFieldLine(0),1) = "0" Then
				Call Proc.ReplaceItemValue("ParserFieldExtension",Right(Proc.ParserFieldLine(0),1))
				Call Proc.ReplaceItemValue("ParserFieldLine",Left(Proc.ParserFieldLine(0),Len(Proc.ParserFieldLine(0))-1))
			End If 
		Elseif Ubound(varPhone) = 2 Then
			
			Call Proc.ReplaceItemValue("ParserFieldCountry",varPhone(0))
			Call Proc.ReplaceItemValue("ParserFieldArea",varPhone(1))
			Call Proc.ReplaceItemValue("ParserFieldLine",varPhone(2))
			If Right(Proc.ParserFieldLine(0),1) = "0" Then
				Call Proc.ReplaceItemValue("ParserFieldExtension",Right(Proc.ParserFieldLine(0),1))
				Call Proc.ReplaceItemValue("ParserFieldLine",Left(Proc.ParserFieldLine(0),Len(Proc.ParserFieldLine(0))-1))
			End If 
			
		Elseif Ubound(varPhone) = 3 Then
			
			Call Proc.ReplaceItemValue("ParserFieldCountry",varPhone(0))
			Call Proc.ReplaceItemValue("ParserFieldArea",varPhone(1))
			Call Proc.ReplaceItemValue("ParserFieldLine",varPhone(2))
			Call Proc.ReplaceItemValue("ParserFieldExtension",varPhone(3))
			
			
		Elseif Ubound(varPhone) = 4 Then
			
			Call Proc.ReplaceItemValue("ParserFieldCountry",varPhone(0))
			Call Proc.ReplaceItemValue("ParserFieldArea",varPhone(1)+ varPhone(2))
			Call Proc.ReplaceItemValue("ParserFieldLine",varPhone(3))
			Call Proc.ReplaceItemValue("ParserFieldExtension",varPhone(4))
			
			
		Elseif Ubound(varPhone) = 5 Then
			
			Call Proc.ReplaceItemValue("ParserFieldCountry",varPhone(0))
			Call Proc.ReplaceItemValue("ParserFieldArea",varPhone(1) + varPhone(2))
			Call Proc.ReplaceItemValue("ParserFieldLine",varPhone(3) + varPhone(4))
			Call Proc.ReplaceItemValue("ParserFieldExtension",varPhone(5))
			
			
		End If 	
	End If
	
	' Validieren der Daten 
	
	'Prüfen der Vorwahl
	
	strCheckArea = Proc.ParserFieldArea(0)
	strCheckLine = Proc.parserFieldLine(0)
	
	If Len(strCheckArea) > 4 Then 
		strCheckNewArea = Left(strCheckArea,4)
		strCheckNewLine = Right(strCheckArea,(Len(strCheckArea)-Len(strCheckNewArea))) +strCheckLine 
		
		If Left(strCheckNewLine,1) = "0" Then
			strCheckNewLine = Right(strCheckNewArea,1) + strCheckNewLine
			strCheckNewArea = Left(strCheckNewArea,Len(strCheckNewArea)-1)
			If Left(strCheckNewLine,1) = "0" Then
				strCheckNewLine = Right(strCheckNewArea,1) + strCheckNewLine
				strCheckNewArea = Left(strCheckNewArea,Len(strCheckNewArea)-1)
				If Left(strCheckNewLine,1) = "0" Then
					strCheckNewLine = Right(strCheckNewArea,1) + strCheckNewLine
					strCheckNewArea = Left(strCheckNewArea,Len(strCheckNewArea)-1)
					If Left(strCheckNewLine,1) = "0" Then
						strCheckNewLine = Right(strCheckNewArea,1) + strCheckNewLine
						strCheckNewArea = Left(strCheckNewArea,Len(strCheckNewArea)-1)
					End If
				End If
			End If
		End If
		
		Proc.ParserFieldArea = strCheckNewArea
		Proc.ParserFieldLine = strCheckNewLine
		
	End If
	
	
	PhoneNumber = Proc.ParserFieldCountry(0) + " " +Proc.ParserFieldArea(0) + " / "+ Proc.ParserFieldLine(0) + " - " +Proc.ParserFieldExtension(0)
	Call Proc.Replaceitemvalue("ParserFieldComplete", PhoneNumber)
End Sub
Titel: Re: Telefonnummern Parsen
Beitrag von: guesswho am 16.01.08 - 18:48:50
sorry Robert, würd dir gern helfen, aber mir ist grad übel :P
Titel: Re: Telefonnummern Parsen
Beitrag von: flaite am 16.01.08 - 19:27:37
Wochenende schaff ichs vielleicht.
Ist ok, wenn das im Sinne der Aufgabenstellung ist.
Aber eigentlich sollte man dafür echt regex nehmen.
Ist schon sehr viel code im Verhältnis zur Aufgabe. 
Parsen kann beliebig komplex werden.

 

Titel: Re: Telefonnummern Parsen
Beitrag von: bikerboy am 17.01.08 - 08:56:29
sorry Robert, würd dir gern helfen, aber mir ist grad übel :P

Warum überl ist der Code so beschissen ?
Titel: Re: Telefonnummern Parsen
Beitrag von: guesswho am 17.01.08 - 18:39:16
Hallo Robert,

nein, das würde ich niemals sagen. Ich sag mal so, es wird mir einfach schlecht, wenn sich Variablen und Arrays ständig wiederholen, wenn (fast) gleiche Kostrukte so oft auftauchen. Das geht definitiv einfacher, lesbarer und besser wartbar. Aber vielleicht bist du noch am Anfang und willst das noch überarbeiten. Dann mach das später.

Allerdings: das ist dann wie neu programmieren....

mal ganz einfach

For i = 1 to 9
   replaceArray(i) = " "
next

wenn dein Array auf 15 anwächst, dann machst du aus 9 eben 15, aber auch das ist noch zu umständlich, was soll man denn mit leeren Inhalten in einem Array ?!

Da solltest oder könntest du wahrlich noch manches optimieren. Ich kann das imer noch nicht von oben nach unten durchlesen. Nicht böse gemeint, aber ganz ehrlich...

Ist nicht böse gemeint, nur ein Hinweis von meiner Wenigkeit.
Jo

Titel: Re: Telefonnummern Parsen
Beitrag von: bikerboy am 18.01.08 - 12:49:03
Ja geb dir ja recht, habe auch elegantere Lösungen,


das war ja auch nur der erste Anlauf Quick and Dirty.

Mal sehen wann ich vom Chef Zeit dafür bekomme
Titel: Re: Telefonnummern Parsen
Beitrag von: guesswho am 18.01.08 - 18:29:52
Robert,

dachte ich mir, a-bär denk immer dran: The Problem with quick an dirty is that the Dirty remains much longer than the Quick...  ;D

Edit: Ein Chef ist nicht dafür da, Zeit zu geben. Tut ein Chef auch nie. Da musst du klar sagen, hab ich Zeit, dann mach ich das gern und gut, hab ich die Zeit nicht, dann sabbel ich das hin. Oder Kampfstrategie: Entweder ich krieg Zeit für das Projekt (und den Lerneffekt!!!) oder ich kann das nicht umsetzen! Wenns dann klemmt, Finger raus, Chef fällig. Tschüss Chef, vielleicht kommt ja was Besseres nach...

Jo
Titel: Re: Telefonnummern Parsen
Beitrag von: LN4ever am 19.01.08 - 11:48:05
Lieber Radlbub,

Telefonnummern parsen, um sie in ein standardisiertes Format zu bringen, ist sehr sinnvoll, weil man damit dann z.B. CTI-Anbindungen von Applikationen realisieren kann. Aber welchen Sinn es machen soll, Telefonnummern in mehrere Felder zu zerschnippseln, kann und will mir nicht einleuchten. Ich habe nämlich seit Jahren eine Anwendung, in der der Programmierer genau diese Zerteilung vorgesehen hat, an die sich die Anwender aber beim Ausfüllen nicht halten.

Jede Einzelinformation der zerteilten Telefonnummern findest du normalerweise auch in anderen Feldern - und dort viel besser (Land, Ort).

Hintergrund geparster Nummern für eine Telefonanbindung ist doch die Frage, wie viele Teile der Nummer du in welchem Umfeld für einen bestimmten Anrufer nicht mitwählen mußt. Und das kannst du am einfachsten ermitteln, wenn die komplette Telefonnummer in einem einzigen Feld steht.

Überleg es dir gut, ob du wirklich 4 Felder füllen willst. Mein Tip: Parsen Ja, zerschnippseln Nein.

Gruß

Norbert
Titel: Re: Telefonnummern Parsen
Beitrag von: diali am 20.01.08 - 07:10:20
also zum Thema CTI, es spielt keine Rolle für CTI wo ich mich befinde und wo der angerufene sich befindet. Man übergibt immer die komplette Rufnummer inkl. der Landesvorwahl. Damit kann die Anwendung auch länderübergreifend verwendet werden und sich (sofern richtig konfiguriert) die Telefonanlage darum kümmert, ob es sich um anlageninterne Anrufe oder externe Anrufe handelt und diese richtig routet.

Im Handy gibt man auch nur die Nummern im internationalen Format ein, weil sonst die Telefonnummern im Ausland nicht funktionieren. Wer hier die Nummern falsch eingetragen hat, muss entweder im AUsland jedesmal die Nummer von Hand wählen oder seinen Einträge berichtigen. Genau so verhällt es sich bei einer Anwendung, die falsch bedient wird.

In einigen meiner Anwendungen zerlege ich die Telefonnummer bei festnetzanschlüssen auch in 4 Zahlenfelder (Landeskennung, Ortsvorwahl, Anlageneinwahl, Durchwahl). Dabei handelt es sich um reine Zahlenfelder und außer dem Anlageneinwahlfeld um Pflichtfelder. Landeskennung und Ortsvorwahl kommen dabei aus einer zentralen Datenbank.

Vorteil die Nummer kann für den Anwender in jeder Form formatiert angezeigt werden und es schleichen sich weniger Schreibfehler ein. Außerdem muss die Nummer dann nicht mehr geparst werden.
Titel: Re: Telefonnummern Parsen
Beitrag von: bikerboy am 21.01.08 - 08:41:41
ja aber was soll ich denn machen die Anwendung braucht halt die nummer in 4 teilen. das war bis jetzt immer so und wird sich auch nicht ändern.

Und bitte nennt mich nicht mehr Radlbub!!! Ich habe doch schon meinen vollständigen Namen unter den Post. Und ich mag den Namen. Es geht hier um Motorrad fahren, nicht um Fahräder !
Titel: Re: Telefonnummern Parsen
Beitrag von: flaite am 21.01.08 - 09:20:22
Um ausloten zu können, inwieweit sich regex über LS2J für solche Anwendungsfälle nutzen lassen, schreib ich ein kleines Stück wiederverwendbaren Code.
Gleichzeitig hab ich aber z.Zt. wenig Zeit. Schätze aber, dass ich das morgen als .nsf posten kann.

Hier schonmal ein Beispiel wie die Regex aussehen könnte und die Ergebnisse.
Geprüft (und formatiert ) werden soll auf deutsche Festnetznummern.
 
Code
1. (0049)02234 64480
2. 49223464480
4. 00496 2234 64480
5. 0049 (0)2234 64480
6. 02234 644480
~~~~
^((\(?(00)?49\)?)?(-|\s)?((0|\(0\))?\s?[0-9]{3,4})((-|\s)?[0-9]{5,8})){1}$
Überhalb von ~~~~ sind ein paar Beispieleingaben. Dadrunter die regex selbst.
Die Regex meint ungefähr:
((\(?(00)?49\)?)? -> für Ländervorwahl.
((0|\(0\))?\s?[0-9]{3,4}) -> für Ortsvorwahl.
[0-9]{5,8} -> für Nummer.

hier die Ergebnisse:
Code
C:\eclipse33\eclipse\workspace\Regex\src\in.txt
*************************
1. (0049)02234 64480
Regular expression: "^((\(?(00)?49\)?)?(-|\s)?((0|\(0\))?\s?[0-9]{3,4})((-|\s)?[0-9]{5,8})){1}$"
Match "(0049)02234 64480" at postion 0-16
m.group(1)=(0049)02234 64480
m.group(2)=(0049)
m.group(3)=00
m.group(4)=null
m.group(5)=02234
m.group(6)=0
m.group(7)= 64480
*************************
2. 49223464480
Regular expression: "^((\(?(00)?49\)?)?(-|\s)?((0|\(0\))?\s?[0-9]{3,4})((-|\s)?[0-9]{5,8})){1}$"
Match "49223464480" at postion 0-10
m.group(1)=49223464480
m.group(2)=49
m.group(3)=null
m.group(4)=null
m.group(5)=2234
m.group(6)=null
m.group(7)=64480
*************************
3. 00496 2234 64480
Regular expression: "^((\(?(00)?49\)?)?(-|\s)?((0|\(0\))?\s?[0-9]{3,4})((-|\s)?[0-9]{5,8})){1}$"
NO MATCH
*************************
4. 0049 (0)2234 64480
Regular expression: "^((\(?(00)?49\)?)?(-|\s)?((0|\(0\))?\s?[0-9]{3,4})((-|\s)?[0-9]{5,8})){1}$"
Match "0049 (0)2234 64480" at postion 0-17
m.group(1)=0049 (0)2234 64480
m.group(2)=0049
m.group(3)=00
m.group(4)= 
m.group(5)=(0)2234
m.group(6)=(0)
m.group(7)= 64480
*************************
5. 02234 644480
Regular expression: "^((\(?(00)?49\)?)?(-|\s)?((0|\(0\))?\s?[0-9]{3,4})((-|\s)?[0-9]{5,8})){1}$"
Match "02234 644480" at postion 0-11
m.group(1)=02234 644480
m.group(2)=null
m.group(3)=null
m.group(4)=null
m.group(5)=02234
m.group(6)=0
m.group(7)= 644480
Wie man sieht ist die Länderkennzeicheneingabe optional.
Punkt 3 ist ein NO MATCH. (Das Länderkennzeichen von Deutschland ist 0049, wobei 00 optional sind.
Feste Standards für die Eingabe, würden die Regex erleichtern. Regexs können sowas extrem gut prüfen. In einer Messagebox kann dem Anwender die richtige Formatierung mitgeteilt werden, falls der Text auf die Regex fehlschlägt.
Mir schwebte aber wie oben angedeutet etwas anderes vor. Das System akzeptiert sehr verschiedene Formatierungen, formatiert es dann aber in einer Art Eingabeumsetzung einheitlich. Mal schauen wie weit man damit kommt. Dafür dieses ganze groups-Zeugs (ist ein Regex-Feature).
In der .nsf sollen dann beide Anwendungsszenarien unterschützt werden.

Hier ist noch der Java Code für den Test selbst:
Code
package de.spi.regex;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestRegularExpression {

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		File file = new File("src/in.txt");
		System.out.println(file.getAbsolutePath());
		List input = new ArrayList();
		List regex = new ArrayList();
		BufferedReader bufInputReader = new BufferedReader(new FileReader(file));
		String line;
		boolean isInput = true;
		while ((line = bufInputReader.readLine()) != null) {
			if (line.startsWith("~~~")) {
				isInput = false;
			} else if (isInput) {
				input.add(line);
			} else {
				regex.add(line);
			}
		}
		if ((input.size() == 0) || (regex.size() == 0)) {

			System.out.println("No input or regex");
			System.exit(0);
		}

		for (int i = 0; i < input.size(); i++) {
			String inputS = input.get(i).toString();
			System.out.println("*************************");
			System.out.println(inputS);
			
			for (int j = 0; j < regex.size(); j++) {
				String regexS = regex.get(j).toString();
				System.out.println("Regular expression: \"" + regexS + "\"");
				Pattern p = Pattern.compile(regexS);
				Matcher m = p.matcher(inputS);
				boolean match=false;
				while (m.find()) {
					match = true;
					System.out.println("Match \"" + m.group()
							+ "\" at postion " + m.start() + "-"
							+ (m.end() - 1));
					for (int k=1;k<m.groupCount();k++) {
						System.out.println("m.group(" + k + ")=" + m.group(k));
					}
					
				}
				if (!match) {
					System.out.println("NO MATCH");
				}

			}
		}

	}

}

Gruß Axel