2011-07-19 22 views
5

我需要一個正則表達式來解析屬性文件中的鍵值對,將它們寫入數據庫。該應用程序是用java編寫的。因爲我需要存儲關於註釋行和空行的信息,所以properties.load不適用於我包含未轉義空格的鍵值對的正則表達式

關鍵是直到第一次出現未轉義的空格或等號(包括轉義的空格)。 值是一切直到行尾,但也可以是空的。

它必須符合以下情況:

  • 鍵=值
  • 鍵值
  • 鍵=值值
  • 鍵值值
  • 密鑰\鍵\鍵=值
  • 鍵\鍵\鍵值

我試過以下的正則表達式,但它不能正常單獨最後兩種情況:

^(\\\s|[^\s=]+)+[\s|=](.*)?$ 

在過去的兩個例子我得到Rubular:

1. key\ 
2. key\ key value 

,而不是

我也試過 this,但它對我也不起作用

在此先感謝您的幫助!

回答

2

你想使用負回顧後(?<!\\\\)\s檢查你的空間時,

^((.*?)((?<!\\\\)\\s|=)(.*?)|(\\w+))$ 

其分解

(.*?)    Match everything non greedy up to the next match 
((?<!\\\\)\\s|=) Match witespace not preceded by \\ 
(.*?)    Again match everything non greedy up to the next match 
|\\w+    Or match strings with no whitespace - this captures case 3 with no value 

與測試每種情況此處的工具http://www.cis.upenn.edu/~matuszek/General/RegexTester/regex-tester.html

+0

似乎工作正常。感謝您的幫助和解釋! :) – Sebastian

+1

您也可以使用'(。*?)((((?<!\\\\)\\ s | =)(。*?))?'來一致地使用組#1來獲得密鑰和組#4來獲得價值。除非你真的需要匹配字符串的開始/結尾,否則你可以將它們排除,因爲Matcher.matches()會匹配整個字符串。 –

+0

@ Dan-Cruz非常好的簡化 - 你應該添加它作爲你自己的答案,並得到它的一些功勞。 – cordsen

0

試(請記住這是普通的正則表達式,所以你必須要小心反斜線寫它時,作爲Java字符串逃過):

^(\\\s|[^\s=])+(.*)$ 
+0

此正則表達式僅捕獲密鑰的最後一個字符。 – Sebastian

+0

你忘了幾刀:'^(\\\\ s | ....)'。 –

+0

@Sebastian:對,對不起,我沒有工具在這裏測試,只是用我的大腦:) – LeleDumbo