[Schmitzm-commits] r1800 - in trunk/schmitzm-adresses/src: main/java/de/schmitzm/adresses test/java/de/schmitzm/adresses
scm-commit@wald.intevation.org
scm-commit at wald.intevation.org
Thu Dec 1 19:03:32 CET 2011
Author: alfonx
Date: 2011-12-01 19:03:32 +0100 (Thu, 01 Dec 2011)
New Revision: 1800
Modified:
trunk/schmitzm-adresses/src/main/java/de/schmitzm/adresses/AddrStringUtil.java
trunk/schmitzm-adresses/src/test/java/de/schmitzm/adresses/AddrStringUtilTest.java
Log:
Modified: trunk/schmitzm-adresses/src/main/java/de/schmitzm/adresses/AddrStringUtil.java
===================================================================
--- trunk/schmitzm-adresses/src/main/java/de/schmitzm/adresses/AddrStringUtil.java 2011-11-30 16:26:33 UTC (rev 1799)
+++ trunk/schmitzm-adresses/src/main/java/de/schmitzm/adresses/AddrStringUtil.java 2011-12-01 18:03:32 UTC (rev 1800)
@@ -11,25 +11,23 @@
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
+import com.sun.tools.internal.xjc.Language;
+
import de.schmitzm.lang.LangUtil;
+import de.schmitzm.regex.RegexCache;
/**
- * Diese Klasse bietete nützliche Methoden zur Bearbeitung von
- * Addressschreibweisen. Zur Zeit werden nur Strings mit Strasse [Hn] [Zusatz]
- * behandelt.<br/>
- * Es werden Methoden zum Aufteilen (Splitten) von String angeboten, um Strasse
- * +Hn + Zusatz in drei Strings zu zerlegen. Weiterhin existieren Methoden um
- * die Schreibweisen von Straßen, Hausnummern un Zusätzen zu normalisieren.
- * Diese normalisierten Strings können dann zum abgeleichen von
- * Addressinformationen verwendet werden.<br/>
- * Ersetzungsregeln für die Normalisierung werden in drei Excel-Dateien
- * verwaltet.<br/>
+ * Diese Klasse bietete nützliche Methoden zur Bearbeitung von Addressschreibweisen. Zur Zeit werden nur Strings mit
+ * Strasse [Hn] [Zusatz] behandelt.<br/>
+ * Es werden Methoden zum Aufteilen (Splitten) von String angeboten, um Strasse +Hn + Zusatz in drei Strings zu
+ * zerlegen. Weiterhin existieren Methoden um die Schreibweisen von Straßen, Hausnummern un Zusätzen zu normalisieren.
+ * Diese normalisierten Strings können dann zum abgeleichen von Addressinformationen verwendet werden.<br/>
+ * Ersetzungsregeln für die Normalisierung werden in drei Excel-Dateien verwaltet.<br/>
*/
public class AddrStringUtil {
static final private Logger log = Logger.getLogger(AddrStringUtil.class);
- final static Pattern REGEX_splitHnZusatz = Pattern
- .compile("(\\d+)\\s*(.*?)\\s*$");
+ final static Pattern REGEX_splitHnZusatz = Pattern.compile("(\\d+)\\s*(.*?)\\s*$");
final static Pattern REGEX_splitFullString = Pattern
.compile("^(.*\\d+\\.+[^\\d]*|[^\\d,]+)"
+ "\\s*"
@@ -41,14 +39,12 @@
// final static Pattern REGEX_hnBereich = Pattern
// .compile("(\\d+)([^\\d]?)(\\s*)(-|bis)(\\s*)(\\w+).*");
- final static Pattern REGEX_hnListe = Pattern
- .compile("(\\d+)([^\\d]+)(\\d+).*");
+ final static Pattern REGEX_hnListe = Pattern.compile("(\\d+)([^\\d]+)(\\d+).*");
final static Pattern REGEX_hnEinzeln = Pattern.compile("(\\d+)(.*)");
/**
- * Normalisiert die Schreibweise eines Straßennamens, z.B.
- * "Dr.-Vogeler-Str." -> "drvogelerstrasse"
+ * Normalisiert die Schreibweise eines Straßennamens, z.B. "Dr.-Vogeler-Str." -> "drvogelerstrasse"
*
* @deprecated
*/
@@ -59,8 +55,23 @@
/**
* Normalisiert die Schreibweise einer Hausnummer, z.B. " 5 " -> "5"
*/
- public static final NormResult normalizeHn(final String hn) {
- return normalize(RuleRegistry.getRulesHn(), hn);
+ public static final String normalizeHn(String hn) {
+
+ hn = LangUtil.removeWhitespacesToNull(hn);
+ if (hn == null)
+ return null;
+
+ Pattern p = RegexCache.getInstance().getPattern("(\\d+)\\s*\\1");
+ Matcher matcher = p.matcher(hn);
+ if (matcher.find())
+ return matcher.group(1);
+
+ p = RegexCache.getInstance().getPattern("(\\d\\d+)\\D*\\1");
+ matcher = p.matcher(hn);
+ if (matcher.find())
+ return matcher.group(1);
+
+ return hn;
}
/**
@@ -73,8 +84,7 @@
/**
* Applies the given "Rules"/ Transformations to the given String.
*/
- private static NormResult normalize(final List<NormRule> rules,
- final String string) {
+ private static NormResult normalize(final List<NormRule> rules, final String string) {
if (string == null)
return new NormResult(null);
@@ -93,16 +103,14 @@
}
/**
- * Diese Methode teilt einen String, der Hausnummer und einen optionalen
- * Zusatz enhält, in zwei Strings.
+ * Diese Methode teilt einen String, der Hausnummer und einen optionalen Zusatz enhält, in zwei Strings.
*
* @param origHn
- * darf <code>null</code> sein. Kann nur die HN oder HN+ZUSATZ
- * enthalten.
+ * darf <code>null</code> sein. Kann nur die HN oder HN+ZUSATZ enthalten.
* @param origZusatz
* darf <code>null</code> sein.
- * @return Zwei Strings, zuerst ein String mit der Hausnummer (oder null),
- * und als zweites ein String mit dem Zusatz (oder null).
+ * @return Zwei Strings, zuerst ein String mit der Hausnummer (oder null), und als zweites ein String mit dem Zusatz
+ * (oder null).
*/
public static String[] splitHn(final String origHn, final String origZusatz) {
if (origHn == null)
@@ -139,16 +147,14 @@
}
/**
- * Diese Methode teilt einen String, der Strasse, Hausnummer und einen
- * optionalen Zusatz enhält, in zwei Strings.
+ * Diese Methode teilt einen String, der Strasse, Hausnummer und einen optionalen Zusatz enhält, in zwei Strings.
*
* @param origStrasseFull
* darf null sein.
* @param origHn
* darf null sein.
* @param origZusatz2
- * @return Drei Strings, strasse, dann Hausnummer, und als drittes ein
- * String mit dem Zusatz. ALle können null sein.
+ * @return Drei Strings, strasse, dann Hausnummer, und als drittes ein String mit dem Zusatz. ALle können null sein.
*/
public static String[] split(final String... stringStrHnZusatz) {
@@ -168,8 +174,7 @@
if (stringStrHnZusatz.length == 3)
origZusatz = stringStrHnZusatz[2];
- if (origStrasse == null || origStrasse.isEmpty()
- || !origStrasse.matches(".*[A-Za-z][A-Za-z]+.*")) {
+ if (origStrasse == null || origStrasse.isEmpty() || !origStrasse.matches(".*[A-Za-z][A-Za-z]+.*")) {
final String[] splitHn = splitHn(origHn, origZusatz);
return new String[] { null, splitHn[0], splitHn[1] };
}
@@ -185,8 +190,7 @@
origZusatz = trimQuotes(origZusatz);
}
- String zusammen = origStrasse + " "
- + (origHn != null ? " " + origHn : "")
+ String zusammen = origStrasse + " " + (origHn != null ? " " + origHn : "")
+ (origZusatz != null ? " " + origZusatz : "");
zusammen = trimQuotes(zusammen);
zusammen = removeKommataAfterStreetname(zusammen);
@@ -205,8 +209,7 @@
// + origStrasse + " " + origHn + " " + origZusatz);
// return new String[] { null, splitHn[0], splitHn[1] };
- Pattern p = Pattern
- .compile("([^\\d]*)\\s([\\d]+[^\\s]*|[\\d]+\\s+\\d+)$");
+ Pattern p = Pattern.compile("([^\\d]*)\\s([\\d]+[^\\s]*|[\\d]+\\s+\\d+)$");
m = p.matcher(zusammen);
if (m.find()) {
strasse = m.group(1);
@@ -247,8 +250,7 @@
strasse = StringUtils.trimToNull(strasse);
if (strasse == null || strasse.length() < 3) {
- final Pattern p = Pattern
- .compile("(.+?)\\s([\\d]+[-]?[\\d]*)(.*)$");
+ final Pattern p = Pattern.compile("(.+?)\\s([\\d]+[-]?[\\d]*)(.*)$");
m = p.matcher(zusammen);
if (m.find()) {
strasse = m.group(1);
@@ -271,12 +273,10 @@
}
if (warn)
- log.debug("Aus '" + origStrasse + "' wurde Strasse='" + strasse
- + "', HN='" + StringUtils.trimToNull(hn) + "', Zusatz='"
- + StringUtils.trimToNull(zusatz) + "', richtig?");
+ log.debug("Aus '" + origStrasse + "' wurde Strasse='" + strasse + "', HN='" + StringUtils.trimToNull(hn)
+ + "', Zusatz='" + StringUtils.trimToNull(zusatz) + "', richtig?");
- return new String[] { strasse, StringUtils.trimToNull(hn),
- StringUtils.trimToNull(zusatz) };
+ return new String[] { strasse, StringUtils.trimToNull(hn), StringUtils.trimToNull(zusatz) };
}
/**
@@ -292,14 +292,11 @@
* @return
*/
public static String removeKommataAfterStreetname(String zusammen) {
- return zusammen.replaceAll("([A-Za-z][A-Za-z]+)\\s?[,]\\s?(\\d+)",
- "$1 $2");
+ return zusammen.replaceAll("([A-Za-z][A-Za-z]+)\\s?[,]\\s?(\\d+)", "$1 $2");
}
- private static String removeSpacesBetweenHiphenAndDotAndLetters(
- String zusammen) {
- zusammen = zusammen.replaceAll("([A-Za-z]+)\\s+([.-]*)\\s?([.-])+",
- "$1$2$3");
+ private static String removeSpacesBetweenHiphenAndDotAndLetters(String zusammen) {
+ zusammen = zusammen.replaceAll("([A-Za-z]+)\\s+([.-]*)\\s?([.-])+", "$1$2$3");
return zusammen;
}
@@ -324,26 +321,23 @@
}
// TODO sauberes rewrite unter besserer Ausnutzung von Rekursion
- public static TreeSet<String> getHausnummernInterpreted(
- final String hausnummern) {
- final TreeSet<String> result = new TreeSet<String>(
- new Comparator<String>() {
+ public static TreeSet<String> getHausnummernInterpreted(final String hausnummern) {
+ final TreeSet<String> result = new TreeSet<String>(new Comparator<String>() {
- @Override
- public int compare(String o1, String o2) {
- try {
- Integer i1 = Integer.parseInt(o1);
- Integer i2 = Integer.parseInt(o2);
- return i1.compareTo(i2);
- } catch (Exception e) {
- return o1.compareTo(o2);
- }
- }
- });
+ @Override
+ public int compare(String o1, String o2) {
+ try {
+ Integer i1 = Integer.parseInt(o1);
+ Integer i2 = Integer.parseInt(o2);
+ return i1.compareTo(i2);
+ } catch (Exception e) {
+ return o1.compareTo(o2);
+ }
+ }
+ });
if (hausnummern != null) {
- final Matcher m = Pattern.compile("(\\d)+\\s*([a-z]+)[,]([a-z]+)")
- .matcher(hausnummern);
+ final Matcher m = Pattern.compile("(\\d)+\\s*([a-z]+)[,]([a-z]+)").matcher(hausnummern);
if (m.find()) {
result.addAll(getHausnummern(m.group(1) + m.group(2)));
result.addAll(getHausnummern(m.group(1) + m.group(3)));
@@ -372,8 +366,7 @@
if (m.find()) {
// 15a - f
- if (!m.group(2).isEmpty() && m.group(4).isEmpty()
- && !m.group(5).isEmpty()) {
+ if (!m.group(2).isEmpty() && m.group(4).isEmpty() && !m.group(5).isEmpty()) {
for (char a = m.group(2).charAt(0); a <= m.group(5).charAt(0); a++) {
result.add(m.group(1) + a);
@@ -383,8 +376,7 @@
// TODO Hier stehen manchmal nicht nur zahlen drin!
/**
- * Stefan Tzeggai : Was soll das programm aus "9a - 11d" machen?
- * "9a, 10, 11d" ?
+ * Stefan Tzeggai : Was soll das programm aus "9a - 11d" machen? "9a, 10, 11d" ?
*/
// Überprüfen, ob hinter der Zahl noch was steht...
@@ -393,11 +385,9 @@
final String maxNumStr = m.group(4);
// 12-15
- if (m.group(2).isEmpty() && !maxNumStr.isEmpty()
- && m.group(5).isEmpty()) {
+ if (m.group(2).isEmpty() && !maxNumStr.isEmpty() && m.group(5).isEmpty()) {
// Keine Zusätze in dem Bereich...
- log.debug("Versuche Hausnummernbereich " + minNumStr + " bis "
- + maxNumStr + " aufzulösen...");
+ log.debug("Versuche Hausnummernbereich " + minNumStr + " bis " + maxNumStr + " aufzulösen...");
final int min = Integer.parseInt(minNumStr);
final int max = Integer.parseInt(maxNumStr);
@@ -413,8 +403,7 @@
result.add(Integer.toString(i));
}
} else {
- log.debug("Hausnummernbereich " + minNumStr + m.group(2)
- + " bis " + maxNumStr + m.group(5)
+ log.debug("Hausnummernbereich " + minNumStr + m.group(2) + " bis " + maxNumStr + m.group(5)
+ " kann noch nicht hochgezählt werden.");
if (!minNumStr.isEmpty())
result.add(minNumStr + m.group(2));
@@ -440,17 +429,15 @@
return result;
}
- log.error("Hausnummer raw '" + hausnummerUntested
- + "' nicht verstanden.");
+ log.error("Hausnummer raw '" + hausnummerUntested + "' nicht verstanden.");
return result;
}
/**
- * Interpretiert eine GKZ, KKZ etc anhang Ihrer Länge und liefert ob es sich
- * um einen KREIS oder ein BUNDESLAND handelt
+ * Interpretiert eine GKZ, KKZ etc anhang Ihrer Länge und liefert ob es sich um einen KREIS oder ein BUNDESLAND
+ * handelt
*
- * @return <code>null</code> wenn <code>null</code> übergeben worde oder der
- * code nicht verstanden wurde.
+ * @return <code>null</code> wenn <code>null</code> übergeben worde oder der code nicht verstanden wurde.
*/
static Ebene getEbeneForEbeneCode(String code) {
if (code == null)
@@ -466,8 +453,7 @@
}
/**
- * Normalisiert die Schreibweise eines Straßennamens, z.B.
- * "Dr.-Vogeler-Str." -> "drvogelerstrasse"
+ * Normalisiert die Schreibweise eines Straßennamens, z.B. "Dr.-Vogeler-Str." -> "drvogelerstrasse"
*/
public static final String normalizeStr(String strasse) {
strasse = LangUtil.removeWhitespacesToEmpty(strasse);
@@ -481,7 +467,7 @@
strasse = strasse.replaceAll("alle(\b|$)", "allee");
strasse = strasse.replaceAll("alee(\b|$)", "allee");
strasse = strasse.replaceAll("\\s*s$", "strasse");
-
+
strasse = strasse.replaceAll("\\bgeschw\\.", "geschwister");
strasse = strasse.replaceAll("ü", "ue");
@@ -502,7 +488,7 @@
}
/**
- * Normalisiert die Schreibweise eines Ortssnamen, z.B. "Hamburg, Hansestadt" zu "hamburg"
+ * Normalisiert die Schreibweise eines Ortssnamen, z.B. "Hamburg, Hansestadt" zu "hamburg"
*/
public static final String normalizeOrt(String ort) {
ort = LangUtil.removeWhitespacesToEmpty(ort);
@@ -511,6 +497,8 @@
ort = ort.toLowerCase();
+ ort = ort.replaceAll("\\brbge\\.?\\b", "ruebenberge");
+
ort = ort
.replaceAll(
"\\b(konrad.?zuse.?|berg|documenta.?|loreley|universit(ae|ä)ts|kreis|landeshaupt|freie und hanse|hanse|)(stadt|st\\.)$",
@@ -527,15 +515,17 @@
ort = ort.replaceAll("\\bkurort$", "");
ort = ort.replaceAll("\\bheilbad\\b", "");
- ort = ort.replaceAll("st(\\.|\\s)", "sankt");
- ort = ort.replaceAll("sta(\\.|\\s)", "sankt");
+ ort = ort.replaceAll("\\bst(\\.|\\s)", "sankt");
+ ort = ort.replaceAll("\\bsta(\\.|\\s)", "sankt");
ort = ort.replaceAll("^maria(-|\\s).", "");
- ort = ort.replaceAll("im breisgau", "ib");
+ ort = ort.replaceAll("\\bi(\\.|\\s)Sa(\\.|\\s)", "insachsen");
- ort = ort.replaceAll("a(\\.|\\s)d(\\.|\\s)", "an der");
- ort = ort.replaceAll("i(\\.|\\s)", "im");
+ ort = ort.replaceAll("\\ba(\\.|\\s)d(\\.|\\s)", "an der");
+ ort = ort.replaceAll("\\bi(\\.|\\s)", "im");
+ ort = ort.replaceAll("\\ba(\\.|\\s)", "am");
+ ort = ort.replaceAll("\\bb(\\.|\\s)", "bei");
ort = ort.replaceAll("ü", "ue");
ort = ort.replaceAll("ö", "oe");
Modified: trunk/schmitzm-adresses/src/test/java/de/schmitzm/adresses/AddrStringUtilTest.java
===================================================================
--- trunk/schmitzm-adresses/src/test/java/de/schmitzm/adresses/AddrStringUtilTest.java 2011-11-30 16:26:33 UTC (rev 1799)
+++ trunk/schmitzm-adresses/src/test/java/de/schmitzm/adresses/AddrStringUtilTest.java 2011-12-01 18:03:32 UTC (rev 1800)
@@ -247,7 +247,8 @@
@Test
public void testNormalizeOrt() {
assertEquals("sanktaugustin", AddrStringUtil.normalizeOrt("St. Augustin"));
- assertEquals("freiburgib", AddrStringUtil.normalizeOrt("Freiburg im Breisgau"));
+ assertEquals("freiburgimb", AddrStringUtil.normalizeOrt("Freiburg im Breisgau"));
+ assertEquals("freiburgimb", AddrStringUtil.normalizeOrt("Freiburg i. B."));
assertEquals("idarobarstein", AddrStringUtil.normalizeOrt("Idar-Obarstein"));
assertEquals("hamburg", AddrStringUtil.normalizeOrt("Hamburg, Hansestadt"));
}
@@ -276,4 +277,15 @@
assertEquals("drvogelerstrasse", AddrStringUtil.normalizeStr("Dr.Vogeler Strase"));
}
+ @Test
+ public void testNormalizeHn()
+ {
+ assertEquals("34", AddrStringUtil.normalizeHn(" 34 34 "));
+ assertEquals("34", AddrStringUtil.normalizeHn("34 34"));
+ assertEquals("34-45", AddrStringUtil.normalizeHn("34-45"));
+ assertEquals("2-2", AddrStringUtil.normalizeHn("2-2"));
+ assertEquals("34", AddrStringUtil.normalizeHn("34"));
+ assertEquals("34", AddrStringUtil.normalizeHn(" 34 "));
+ }
+
}
More information about the Schmitzm-commits
mailing list