Index: trunk/resources/data/validator/numeric.mapcss
===================================================================
--- trunk/resources/data/validator/numeric.mapcss	(revision 19451)
+++ trunk/resources/data/validator/numeric.mapcss	(revision 19453)
@@ -40,7 +40,14 @@
   assertNoMatch: "node level=-1";
 }
-
-*[building:levels][building:levels !~ /^(([0-9]|[1-9][0-9]*)(\.5)?)$/]!.negative_value,
-*[level][level !~ /^((((-*[1-9]|[0-9])|-*[1-9][0-9]*)(\.5)?)|-0\.5)(;((((-*[1-9]|[0-9])|-*[1-9][0-9]*)(\.5)?)|-0\.5))*$/] { /* all numbers from -∞ to ∞ in 0.5 steps, optional multiple values separated by a ; */
+*[building:levels][building:levels !~ /^(([0-9]|[1-9][0-9]*)(\.5)?)$/]!.negative_value {
+  throwWarning: tr("{0} should have numbers only with optional .5 increments", "{0.key}");
+  assertNoMatch: "node building:levels=1.5";
+  assertNoMatch: "node building:levels=-1"; /* excluded here via !.negative_value in selector */
+  assertMatch: "node building:levels=1A";
+  assertNoMatch: "node building:levels=0"; /* valid because there can be building:levels:underground > 0 or roof:levels > 0 */
+}
+
+/* level values: all numbers from -∞ to ∞ in 0.5 steps, optional multiple values separated by a ;, optional second value separated by a - */
+*[level][level !~ /^((((-?[1-9]|[0-9])|-?[1-9][0-9]*)(\.5)?)|-0\.5)(?:(;((((-?[1-9]|[0-9])|-?[1-9][0-9]*)(\.5)?)|-0\.5))*|(-((((-?[1-9]|[0-9])|-?[1-9][0-9]*)(\.5)?)|-0\.5)))$/] {
   throwWarning: tr("{0} should have numbers only with optional .5 increments", "{0.key}");
   assertMatch: "node level=one";
@@ -50,4 +57,8 @@
   assertMatch: "node level=2.3";
   assertMatch: "node level=-0";
+  assertMatch: "node level=1-2-3";
+  assertMatch: "way level=--5";
+  assertMatch: "way level=--5-4";
+  assertMatch: "way level=-5---4";
   assertNoMatch: "node level=0";
   assertNoMatch: "node level=1";
@@ -62,8 +73,8 @@
   assertNoMatch: "node level=-0.5;0";
   assertNoMatch: "node level=-1;-0.5";
-  assertNoMatch: "node building:levels=1.5";
-  assertNoMatch: "node building:levels=-1"; /* tested already by rule above "negative values" and excluded here via !.negative_value in selector */
-  assertMatch: "node building:levels=1A";
-  assertNoMatch: "node building:levels=0"; /* valid because there can be building:levels:underground > 0 or roof:levels > 0 */
+  assertNoMatch: "node level=0-3";
+  assertNoMatch: "node level=-1-100";
+  assertNoMatch: "node level=-10--5";
+  assertNoMatch: "node level=0--1";
 }
 
