So entkommen Sie dem Gleichheitszeichen in Eigenschaftendateien


84

Wie kann ich das Gleichheitszeichen ( =) in Java-Eigenschaftendateien umgehen? Ich möchte Folgendes in meine Datei aufnehmen:

table.whereclause=where id=100

Antworten:


83

Weitere Informationen finden Sie in der Methode zum Laden (Reader Reader) aus der PropertyKlasse auf Javadoc

In der load(Reader reader)Methodendokumentation heißt es

Der Schlüssel enthält alle Zeichen in der Zeile mit den ersten nicht-weißen Leerzeichen beginnen und bis zu, aber nicht einschließlich, die erste unescaped '=', ':'oder Raumzeichen andere als ein Leitungsabschluss. Alle diese Schlüsselabschlusszeichen können in den Schlüssel aufgenommen werden, indem sie mit einem vorhergehenden Backslash-Zeichen maskiert werden. beispielsweise,

\:\=

wäre die zweistellige Taste ":=". Zeilenabschlusszeichen können mit \rund \nEscape-Sequenzen eingefügt werden. Alle Leerzeichen nach dem Überspringen des Schlüssels; Wenn das erste nicht Leerzeichen nach dem Schlüssel '=' oder ist ':', wird es ignoriert und alle Leerzeichen nach dem Schlüssel werden ebenfalls übersprungen. Alle verbleibenden Zeichen in der Zeile werden Teil der zugehörigen Elementzeichenfolge. Wenn keine verbleibenden Zeichen vorhanden sind, ist das Element die leere Zeichenfolge "". Sobald die rohen Zeichenfolgen, aus denen der Schlüssel und das Element bestehen, identifiziert sind, wird die Escape-Verarbeitung wie oben beschrieben durchgeführt.

Hoffentlich hilft das.


88

In Ihrem speziellen Beispiel müssen Sie nicht den Gleichen entkommen - Sie müssen nur entkommen, wenn es Teil des Schlüssels ist. Das Eigenschaftendateiformat behandelt alle Zeichen nach dem ersten nicht entkoppelten Gleichheitszeichen als Teil des Werts.


12
Ich weiß nicht, warum dies nicht markiert wurde! Einfachste richtige Antwort! Und meistens suchen die Leute nach einem entkommenden Wert in der Eigenschaftendatei!
Tejas

1
Kleine Korrektur: Behandelt alle Zeichen als Wert, nachdem die ersten nicht entkoppelten Gleichheitszeichen und nachfolgenden Leerzeichen, dh führende Leerzeichen im Wert , entfernt wurden. Beispiel "myKey = mein Wert" ist dasselbe wie "myKey = mein Wert".
Paulo Merson

22

Das Standard-Escapezeichen in Java ist '\'.
Die Java-Eigenschaftendatei hat jedoch das Format key = value. Sie sollte alles nach dem ersten Wert als Wert berücksichtigen.


7
außer führenden Leerzeichen (oh und das '=' zwischen Schlüssel und Wert ist nicht erforderlich, es könnte sein: oder ein Leerzeichen)
Brad Cupit

15

Der beste Weg, um diese Art von Problemen zu vermeiden, besteht darin, Eigenschaften programmgesteuert zu erstellen und sie dann zu speichern. Verwenden Sie beispielsweise folgenden Code:

java.util.Properties props = new java.util.Properties();
props.setProperty("table.whereclause", "where id=100");
props.store(System.out, null);

Dies würde in System.out die ordnungsgemäß maskierte Version ausgeben.

In meinem Fall war die Ausgabe:

#Mon Aug 12 13:50:56 EEST 2013
table.whereclause=where id\=100

Wie Sie sehen, ist dies eine einfache Möglichkeit, Inhalte von .properties-Dateien zu generieren, die garantiert korrekt sind. Und Sie können so viele Eigenschaften platzieren, wie Sie möchten.


5

In meinem Fall funktionieren zwei führende '\\' gut für mich.

Beispiel: Wenn Ihr Wort das Zeichen '#' enthält (z. B. aa # 100, können Sie es mit zwei führenden '\\' maskieren.

   key= aa\\#100


Ich zweitens, Sie brauchen zwei Backslashes (Glassfish 4.1, Build 13)
Susanta


1

In der Datei Spring oder Spring boot application.properties können Sie den Sonderzeichen entkommen.

table.whereclause = wobei id '\ =' 100


0

Diese Methode soll dazu beitragen, programmgesteuert Werte zu generieren, die garantiert 100% kompatibel mit .propertiesDateien sind:

public static String escapePropertyValue(final String value) {
    if (value == null) {
        return null;
    }

    try (final StringWriter writer = new StringWriter()) {
        final Properties properties = new Properties();
        properties.put("escaped", value);
        properties.store(writer, null);
        writer.flush();

        final String stringifiedProperties = writer.toString();
        final Pattern pattern = Pattern.compile("(.*?)escaped=(.*?)" + Pattern.quote(System.lineSeparator()) + "*");
        final Matcher matcher = pattern.matcher(stringifiedProperties);

        if (matcher.find() && matcher.groupCount() <= 2) {
            return matcher.group(matcher.groupCount());
        }

        // This should never happen unless the internal implementation of Properties::store changed
        throw new IllegalStateException("Could not escape property value");
    } catch (final IOException ex) {
        // This should never happen. IOException is only because the interface demands it
        throw new IllegalStateException("Could not escape property value", ex);
    }
}

Sie können es so nennen:

final String escapedPath = escapePropertyValue("C:\\Users\\X");
writeToFile(escapedPath); // will pass "C\\:\\\\Users\\\\X"

Diese Methode ist etwas teuer, aber das Schreiben von Eigenschaften in eine Datei ist normalerweise ohnehin eine sporadische Operation.


-1

Ich konnte Werte innerhalb des Zeichens eingeben ":

db_user="postgresql"
db_passwd="this,is,my,password"

Warum Downvoting? Es ist eine echte Antwort :)
Russellhoff

Op sagt Java-Eigenschaften, Anführungszeichen funktionieren in Java-Eigenschaftendateien nicht so.
Teknopaul
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.