Index: /trunk/src/org/openstreetmap/josm/data/osm/search/SearchCompiler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/search/SearchCompiler.java	(revision 17745)
+++ /trunk/src/org/openstreetmap/josm/data/osm/search/SearchCompiler.java	(revision 17746)
@@ -898,9 +898,10 @@
          * Constructs a new {@code ExactKeyValue}.
          * @param regexp regular expression
+         * @param caseSensitive {@code true} to perform a case-sensitive search
          * @param key key
          * @param value value
          * @throws SearchParseError if a parse error occurs
          */
-        public ExactKeyValue(boolean regexp, String key, String value) throws SearchParseError {
+        public ExactKeyValue(boolean regexp, boolean caseSensitive, String key, String value) throws SearchParseError {
             if ("".equals(key))
                 throw new SearchParseError(tr("Key cannot be empty when tag operator is used. Sample use: key=value"));
@@ -938,10 +939,10 @@
 
             if (regexp && !key.isEmpty() && !"*".equals(key)) {
-                keyPattern = compilePattern(key, regexFlags(false));
+                keyPattern = compilePattern(key, regexFlags(caseSensitive));
             } else {
                 keyPattern = null;
             }
             if (regexp && !this.value.isEmpty() && !"*".equals(this.value)) {
-                valuePattern = compilePattern(this.value, regexFlags(false));
+                valuePattern = compilePattern(this.value, regexFlags(caseSensitive));
             } else {
                 valuePattern = null;
@@ -2102,7 +2103,7 @@
             String key = tokenizer.getText();
             if (tokenizer.readIfEqual(Token.EQUALS)) {
-                return new ExactKeyValue(regexSearch, key, tokenizer.readTextOrNumber());
+                return new ExactKeyValue(regexSearch, caseSensitive, key, tokenizer.readTextOrNumber());
             } else if (tokenizer.readIfEqual(Token.TILDE)) {
-                return new ExactKeyValue(true, key, tokenizer.readTextOrNumber());
+                return new ExactKeyValue(true, caseSensitive, key, tokenizer.readTextOrNumber());
             } else if (tokenizer.readIfEqual(Token.LESS_THAN)) {
                 return new ValueComparison(key, tokenizer.readTextOrNumber(), -1);
Index: /trunk/test/unit/org/openstreetmap/josm/data/osm/search/SearchCompilerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/osm/search/SearchCompilerTest.java	(revision 17745)
+++ /trunk/test/unit/org/openstreetmap/josm/data/osm/search/SearchCompilerTest.java	(revision 17746)
@@ -147,4 +147,20 @@
 
     /**
+     * Search by case-sensitive regular expression.
+     * @throws SearchParseError if an error has been encountered while compiling
+     */
+    @Test
+    void testRegexpCaseSensitive() throws Exception {
+        SearchSetting searchSetting = new SearchSetting();
+        searchSetting.regexSearch = true;
+        searchSetting.text = "foo=\"^bar$\"";
+        assertTrue(SearchCompiler.compile(searchSetting).match(OsmUtils.createPrimitive("node foo=bar")));
+        assertTrue(SearchCompiler.compile(searchSetting).match(OsmUtils.createPrimitive("node foo=BAR")));
+        searchSetting.caseSensitive = true;
+        assertTrue(SearchCompiler.compile(searchSetting).match(OsmUtils.createPrimitive("node foo=bar")));
+        assertFalse(SearchCompiler.compile(searchSetting).match(OsmUtils.createPrimitive("node foo=BAR")));
+    }
+
+    /**
      * Search by comparison.
      * @throws SearchParseError if an error has been encountered while compiling
