Index: resources/data/validator/numeric.mapcss
===================================================================
--- resources/data/validator/numeric.mapcss	(revision 19132)
+++ resources/data/validator/numeric.mapcss	(working copy)
@@ -67,7 +67,7 @@
   assertNoMatch: "node building:levels=0"; /* valid because there can be building:levels:underground > 0 or roof:levels > 0 */
 }
 
-*[roof:height][roof:height =~ /^0*(\.0*)?( (m|ft))?$/][roof:shape=flat] {
+*[roof:height][siunit_length(tag("roof:height")) == 0][roof:shape=flat] {
   throwWarning: tr("{0} is unnecessary for {1}", "{0.tag}", "{2.tag}");
   group: tr("unnecessary tag");
   fixRemove: "{0.key}";
Index: resources/data/validator/combinations.mapcss
===================================================================
--- resources/data/validator/combinations.mapcss	(revision 19132)
+++ resources/data/validator/combinations.mapcss	(working copy)
@@ -756,7 +756,7 @@
 }
 
 /* #17391 */
-way[highway=pedestrian][width][width<3] {
+way[highway=pedestrian][width][siunit_length(tag(width))<3] {
   throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
   suggestAlternative: "highway=footway";
   group: tr("suspicious tag combination");
@@ -1060,7 +1060,7 @@
 }
 
 /* #21286 */
-area[/^(building|building:part)$/][height =~ /^[0-9]+(\.[0-9]+)?( m)?$/][min_height =~ /^[0-9]+(\.[0-9]+)?( m)?$/][get(split(" ", tag(height)), 0) <= get(split(" ", tag(min_height)), 0)],
+area[/^(building|building:part)$/][height][min_height][siunit_length(tag(height)) <= siunit_length(tag(min_height))],
 area[/^(building|building:part)$/][building:levels][building:min_level][tag("building:levels") <= tag("building:min_level")] {
   throwWarning: tr("{0} is lower or equal to {1} on {2}", "{1.key}", "{2.key}", "{0.key}");
   group: tr("suspicious tag combination");
