Index: /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java	(revision 14795)
+++ /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java	(revision 14796)
@@ -326,3 +326,17 @@
                 "}"));
     }
+
+    /**
+     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/17358">Bug #17358</a>.
+     * @throws ParseException if an error occurs
+     */
+    @Test
+    @Ignore("not fixed yet")
+    public void testTicket17358() throws ParseException {
+        final Collection<TestError> errors = buildTagChecker(
+                "*[/^name/=~/Test/]{" +
+                "  throwWarning: \"Key value match\";" +
+                "}").getErrorsForPrimitive(OsmUtils.createPrimitive("way name=Test St"), false);
+        assertEquals(1, errors.size());
+    }
 }
Index: /trunk/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParserTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParserTest.java	(revision 14795)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParserTest.java	(revision 14796)
@@ -6,4 +6,5 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
+import static org.openstreetmap.josm.gui.mappaint.mapcss.Condition.Context.PRIMITIVE;
 
 import java.awt.Color;
@@ -26,7 +27,9 @@
 import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.Op;
 import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.PseudoClassCondition;
+import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.RegexpKeyValueRegexpCondition;
 import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.SimpleKeyValueCondition;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.ChildOrParentSelector;
 import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.MapCSSParser;
+import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
 import org.openstreetmap.josm.tools.ColorHelper;
@@ -109,5 +112,5 @@
     @Test
     public void testEqualCondition() throws Exception {
-        Condition condition = getParser("[surface=paved]").condition(Condition.Context.PRIMITIVE);
+        Condition condition = getParser("[surface=paved]").condition(PRIMITIVE);
         assertTrue(condition instanceof SimpleKeyValueCondition);
         assertEquals("surface", ((SimpleKeyValueCondition) condition).k);
@@ -119,5 +122,5 @@
     @Test
     public void testNotEqualCondition() throws Exception {
-        KeyValueCondition condition = (KeyValueCondition) getParser("[surface!=paved]").condition(Condition.Context.PRIMITIVE);
+        KeyValueCondition condition = (KeyValueCondition) getParser("[surface!=paved]").condition(PRIMITIVE);
         assertEquals(Op.NEQ, condition.op);
         assertFalse(condition.applies(getEnvironment("surface", "paved")));
@@ -127,5 +130,5 @@
     @Test
     public void testRegexCondition() throws Exception {
-        KeyValueCondition condition = (KeyValueCondition) getParser("[surface=~/paved|unpaved/]").condition(Condition.Context.PRIMITIVE);
+        KeyValueCondition condition = (KeyValueCondition) getParser("[surface=~/paved|unpaved/]").condition(PRIMITIVE);
         assertEquals(Op.REGEX, condition.op);
         assertTrue(condition.applies(getEnvironment("surface", "unpaved")));
@@ -135,5 +138,5 @@
     @Test
     public void testRegexConditionParenthesis() throws Exception {
-        KeyValueCondition condition = (KeyValueCondition) getParser("[name =~ /^\\(foo\\)/]").condition(Condition.Context.PRIMITIVE);
+        KeyValueCondition condition = (KeyValueCondition) getParser("[name =~ /^\\(foo\\)/]").condition(PRIMITIVE);
         assertTrue(condition.applies(getEnvironment("name", "(foo)")));
         assertFalse(condition.applies(getEnvironment("name", "foo")));
@@ -143,5 +146,5 @@
     @Test
     public void testNegatedRegexCondition() throws Exception {
-        KeyValueCondition condition = (KeyValueCondition) getParser("[surface!~/paved|unpaved/]").condition(Condition.Context.PRIMITIVE);
+        KeyValueCondition condition = (KeyValueCondition) getParser("[surface!~/paved|unpaved/]").condition(PRIMITIVE);
         assertEquals(Op.NREGEX, condition.op);
         assertFalse(condition.applies(getEnvironment("surface", "unpaved")));
@@ -151,10 +154,10 @@
     @Test
     public void testBeginsEndsWithCondition() throws Exception {
-        KeyValueCondition condition = (KeyValueCondition) getParser("[foo ^= bar]").condition(Condition.Context.PRIMITIVE);
+        KeyValueCondition condition = (KeyValueCondition) getParser("[foo ^= bar]").condition(PRIMITIVE);
         assertEquals(Op.BEGINS_WITH, condition.op);
         assertTrue(condition.applies(getEnvironment("foo", "bar123")));
         assertFalse(condition.applies(getEnvironment("foo", "123bar")));
         assertFalse(condition.applies(getEnvironment("foo", "123bar123")));
-        condition = (KeyValueCondition) getParser("[foo $= bar]").condition(Condition.Context.PRIMITIVE);
+        condition = (KeyValueCondition) getParser("[foo $= bar]").condition(PRIMITIVE);
         assertEquals(Op.ENDS_WITH, condition.op);
         assertFalse(condition.applies(getEnvironment("foo", "bar123")));
@@ -165,5 +168,5 @@
     @Test
     public void testOneOfCondition() throws Exception {
-        Condition condition = getParser("[vending~=stamps]").condition(Condition.Context.PRIMITIVE);
+        Condition condition = getParser("[vending~=stamps]").condition(PRIMITIVE);
         assertTrue(condition.applies(getEnvironment("vending", "stamps")));
         assertTrue(condition.applies(getEnvironment("vending", "bar;stamps;foo")));
@@ -174,9 +177,9 @@
     @Test
     public void testStandardKeyCondition() throws Exception {
-        KeyCondition c1 = (KeyCondition) getParser("[ highway ]").condition(Condition.Context.PRIMITIVE);
+        KeyCondition c1 = (KeyCondition) getParser("[ highway ]").condition(PRIMITIVE);
         assertEquals(KeyMatchType.EQ, c1.matchType);
         assertTrue(c1.applies(getEnvironment("highway", "unclassified")));
         assertFalse(c1.applies(getEnvironment("railway", "rail")));
-        KeyCondition c2 = (KeyCondition) getParser("[\"/slash/\"]").condition(Condition.Context.PRIMITIVE);
+        KeyCondition c2 = (KeyCondition) getParser("[\"/slash/\"]").condition(PRIMITIVE);
         assertEquals(KeyMatchType.EQ, c2.matchType);
         assertTrue(c2.applies(getEnvironment("/slash/", "yes")));
@@ -186,8 +189,8 @@
     @Test
     public void testYesNoKeyCondition() throws Exception {
-        KeyCondition c1 = (KeyCondition) getParser("[oneway?]").condition(Condition.Context.PRIMITIVE);
-        KeyCondition c2 = (KeyCondition) getParser("[oneway?!]").condition(Condition.Context.PRIMITIVE);
-        KeyCondition c3 = (KeyCondition) getParser("[!oneway?]").condition(Condition.Context.PRIMITIVE);
-        KeyCondition c4 = (KeyCondition) getParser("[!oneway?!]").condition(Condition.Context.PRIMITIVE);
+        KeyCondition c1 = (KeyCondition) getParser("[oneway?]").condition(PRIMITIVE);
+        KeyCondition c2 = (KeyCondition) getParser("[oneway?!]").condition(PRIMITIVE);
+        KeyCondition c3 = (KeyCondition) getParser("[!oneway?]").condition(PRIMITIVE);
+        KeyCondition c4 = (KeyCondition) getParser("[!oneway?!]").condition(PRIMITIVE);
         Environment yes = getEnvironment("oneway", "yes");
         Environment no = getEnvironment("oneway", "no");
@@ -209,5 +212,5 @@
     @Test
     public void testRegexKeyCondition() throws Exception {
-        KeyCondition c1 = (KeyCondition) getParser("[/.*:(backward|forward)$/]").condition(Condition.Context.PRIMITIVE);
+        KeyCondition c1 = (KeyCondition) getParser("[/.*:(backward|forward)$/]").condition(PRIMITIVE);
         assertEquals(KeyMatchType.REGEX, c1.matchType);
         assertFalse(c1.applies(getEnvironment("lanes", "3")));
@@ -215,4 +218,13 @@
         assertTrue(c1.applies(getEnvironment("lanes:backward", "3")));
         assertFalse(c1.applies(getEnvironment("lanes:foobar", "3")));
+    }
+
+    @Test
+    public void testRegexKeyValueRegexpCondition() throws Exception {
+        RegexpKeyValueRegexpCondition c1 = (RegexpKeyValueRegexpCondition) getParser("[/^name/=~/Test/]").condition(PRIMITIVE);
+        assertEquals("^name", c1.keyPattern.pattern());
+        assertEquals("Test", c1.pattern.pattern());
+        assertTrue(c1.applies(getEnvironment("name", "Test St")));
+        assertFalse(c1.applies(getEnvironment("alt_name", "Test St")));
     }
 
@@ -230,5 +242,5 @@
     @Test
     public void testKeyKeyCondition() throws Exception {
-        KeyValueCondition c1 = (KeyValueCondition) getParser("[foo = *bar]").condition(Condition.Context.PRIMITIVE);
+        KeyValueCondition c1 = (KeyValueCondition) getParser("[foo = *bar]").condition(PRIMITIVE);
         Way w1 = new Way();
         w1.put("foo", "123");
@@ -237,5 +249,5 @@
         w1.put("bar", "123");
         assertTrue(c1.applies(new Environment(w1)));
-        KeyValueCondition c2 = (KeyValueCondition) getParser("[foo =~ */bar/]").condition(Condition.Context.PRIMITIVE);
+        KeyValueCondition c2 = (KeyValueCondition) getParser("[foo =~ */bar/]").condition(PRIMITIVE);
         Way w2 = new Way(w1);
         w2.put("bar", "[0-9]{3}");
@@ -450,14 +462,18 @@
     }
 
-    @Test
-    public void testTicket12549() throws Exception {
-        Condition condition = getParser("[name =~ /^(?i)(?u)fóo$/]").condition(Condition.Context.PRIMITIVE);
-        assertTrue(condition.applies(new Environment(OsmUtils.createPrimitive("way name=fóo"))));
-        assertTrue(condition.applies(new Environment(OsmUtils.createPrimitive("way name=fÓo"))));
-        condition = getParser("[name =~ /^(\\p{Lower})+$/]").condition(Condition.Context.PRIMITIVE);
-        assertFalse(condition.applies(new Environment(OsmUtils.createPrimitive("way name=fóo"))));
-        condition = getParser("[name =~ /^(?U)(\\p{Lower})+$/]").condition(Condition.Context.PRIMITIVE);
-        assertTrue(condition.applies(new Environment(OsmUtils.createPrimitive("way name=fóo"))));
-        assertFalse(condition.applies(new Environment(OsmUtils.createPrimitive("way name=fÓo"))));
+    /**
+     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/12549">Bug #12549</a>.
+     * @throws ParseException if a parsing error occurs
+     */
+    @Test
+    public void testTicket12549() throws ParseException {
+        Condition condition = getParser("[name =~ /^(?i)(?u)fóo$/]").condition(PRIMITIVE);
+        assertTrue(condition.applies(getEnvironment("name", "fóo")));
+        assertTrue(condition.applies(getEnvironment("name", "fÓo")));
+        condition = getParser("[name =~ /^(\\p{Lower})+$/]").condition(PRIMITIVE);
+        assertFalse(condition.applies(getEnvironment("name", "fóo")));
+        condition = getParser("[name =~ /^(?U)(\\p{Lower})+$/]").condition(PRIMITIVE);
+        assertTrue(condition.applies(getEnvironment("name", "fóo")));
+        assertFalse(condition.applies(getEnvironment("name", "fÓo")));
     }
 
