Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java	(revision 6454)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java	(revision 6455)
@@ -64,5 +64,5 @@
     public static enum Op {
         EQ, NEQ, GREATER_OR_EQUAL, GREATER, LESS_OR_EQUAL, LESS,
-        REGEX, ONE_OF, BEGINS_WITH, ENDS_WITH, CONTAINS;
+        REGEX, NREGEX, ONE_OF, BEGINS_WITH, ENDS_WITH, CONTAINS;
 
         public boolean eval(String testString, String prototypeString) {
@@ -75,7 +75,8 @@
                 return !equal(testString, prototypeString);
             case REGEX:
+            case NREGEX:
                 Pattern p = Pattern.compile(prototypeString);
                 Matcher m = p.matcher(testString);
-                return m.find();
+                return REGEX.equals(this) ? m.find() : !m.find();
             case ONE_OF:
                 String[] parts = testString.split(";");
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj	(revision 6454)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj	(revision 6455)
@@ -368,4 +368,7 @@
             <EQUAL> <TILDE> { op=Condition.Op.REGEX; } s() val=regex()
         |
+        LOOKAHEAD(2)
+            <EXCLAMATION> <TILDE> { op=Condition.Op.NREGEX; } s() val=regex()
+        |
             (
                     <EXCLAMATION> <EQUAL> { op=Condition.Op.NEQ; }
