Frage

Ich habe config.properties Dateieigenschaften in Java Properties-Format enthalten. Ich brauche den Wert einer Immobilie mit einem bekannten Namen mit einem neuen Wert zu ersetzen. Die Kommentare und die Formatierung der Datei aufbewahrt werden sollen.

Mein aktueller Ansatz ist RegEx zu verwenden, um die Eigenschaftsnamen übereinstimmen und dann seinen Wert ersetzen. Allerdings Java Properties unterstützt Multi-line-Werte, die ich schwer Anpassung haben.

Hier ist ein Beispiel. Angenommen config.properties enthält den folgenden Text:

# A property
A = 1\
     2

# B property
B = 2

Ich möchte den Wert der Immobilie A mit „3“ ersetzen. Das Endergebnis sollte sein:

# A property
A = 3

# B property
B = 2

Mein aktueller RegEx (?s)(A[\\s]*=[\\s]*)(.*) funktioniert nicht richtig.

Bitte legen eine RegEx oder eine eine andere Art und Weise, dies zu tun.

Danke!

War es hilfreich?

Lösung

Versuchen Sie folgendes:

String regex = "(?m)^(A\\s*+=\\s*+)"
    + "(?:[^\r\n\\\\]++|\\\\(?:\r?\n|\r|.))*+$";

verließ ich den ersten Teil, wie Sie es so schrieb ich auf Anpassung der Wert konzentrieren konnte; die Regeln für die Schlüssel und Separator regeln, sind in Wirklichkeit viel komplizierter als das.

Der Wert besteht aus null oder mehr von beliebigen Zeichen außer Wagenrücklauf, Zeilenvorschub oder umgekehrten Schrägstrich oder ein durch eine Linie Separators oder einer einzigen nicht-line-Trennzeichen, gefolgt Backslash. Die Linie Separator eine der drei häufigsten Formen sein können. DOS / Windows (\r\n), Unix / Linux / OSX (\n) oder Pre-OSX Mac (\r)

Beachten Sie, dass der Regex in mehrzeiligen Modus ist so wird die Linie Anker arbeiten, aber nicht Einleiner (DOTALL) Modus. Ich habe auch possessive Quantoren in ganz, weil ich Rückzieher weiß nie nützlich sein.

Andere Tipps

Sie haben Tools in Java zu laden, lesen, ändern und Eigenschaften von Dateien zu speichern.

Persönlich Ich mag Jakarta Commons Konfiguration .

ich mit streetpc einverstanden Jakarta Commons-Konfiguration zur Verwendung.

Allerdings auf Ihrem regex zu konzentrieren, das Problem ist, dass die meisten der regex Motoren auf einer Linie pro Linie Basis standardmäßig arbeiten.

Zum Beispiel in der (ziemlich alt) Perl5Util Klasse (siehe http://jakarta.apache.org/oro/api/org/apache/oro/text/perl/Perl5Util.html ) kann man lesen, dass die Muster haben folgende Syntax:

[m]/pattern/[i][m][s][x]

Die m-Präfix ist optional und die Bedeutung der optionalen hinteren Optionen sind:

i    case insensitive match 
m    treat the input as consisting of multiple lines 
s    treat the input as consisting of a single line 
x    enable extended expression syntax incorporating whitespace and comments
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top