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
Joshua
quelle

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.

Mohd Farid
quelle
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.

wrschneider
quelle
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.

Padmarag
quelle
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.

mvmn
quelle
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

Monsif EL AISSOUSSI
quelle
Ich zweitens, Sie brauchen zwei Backslashes (Glassfish 4.1, Build 13)
Susanta
2

Sie können hier nachsehen. Kann der Schlüssel in einer Java-Eigenschaft ein Leerzeichen enthalten?

für Flucht gleich '=' \ u003d

table.whereclause = wobei id = 100

Schlüssel: [table.whereclause] Wert: [wobei id = 100]

table.whereclause \ u003dwhere id = 100

Schlüssel: [table.whereclause = where] Wert: [id = 100]

table.whereclause \ u003dwhere \ u0020id \ u003d100

Schlüssel: [table.whereclause = wobei id = 100] Wert: []

Veaceslav Serghienco
quelle
1

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

table.whereclause = wobei id '\ =' 100

sent.ror
quelle
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.

DanielCuadra
quelle
-1

Ich konnte Werte innerhalb des Zeichens eingeben ":

db_user="postgresql"
db_passwd="this,is,my,password"
russellhoff
quelle
Warum Downvoting? Es ist eine echte Antwort :)
Russellhoff
Op sagt Java-Eigenschaften, Anführungszeichen funktionieren in Java-Eigenschaftendateien nicht so.
Teknopaul