2010-06-17 64 views
1

我有一些字符串需要通過RegEx進行匹配。我們有一個Java應用程序,它從配置文件中讀取正則表達式,並採用兩組字符串,其中的數字在相同的配置中指定。RegEx匹配模式並排除部分字符串

E.g.

CustomAction.523274ca945f.dialogLabel=Executing Custom Code... 

(?m)^(?!#)\s*(\S*)\s*=\s*(\S*.*) 

我需要的是選擇第一組「CustomAction.523274ca945f.dialogLabel」,並排除隨機字符串在中間,所以我最終的東西,如「CustomAction.dialogLabel」或「匹配CustomAction..dialogLabel「以及任何其他組合,但隨機字符串。

我沒有我正在使用的java應用程序的源代碼。這是一個應用程序的,我可以創造中,我指定一種模式和兩組配置文件和應用程序挑選他們

 
pattern: (?m)^(?!#)\\s*([^.=\\s]*)\\.(?:[^.=\\s]*\\.)?([^.=\\s]*)\\s*=\\s*(.*?)\\s*$ 
key_group: 1 
value_group: 2 

我只能指定每個鍵一組,每一個值。根據這種模式,app選擇key_group作爲key和value_group作爲它的值。

我不想垃圾在中間,因爲它是隨機的,每次都會改變密鑰。

回答

2

兩種方法;首先假定你的財產是三項渴望一個簡單的更換你的第一個(\ S *)與:

(\S+?)\.\S+?\.(\S+) 

注意我也改變了對* +,因爲它沒有任何意義有「..」作爲屬性的一部分,我也使用了非貪婪的限定符,但如果沒有它們,它仍然可以正常工作。然後,您可以使用適當的組編號重建調整後的屬性。第二種方法假設您的隨機字符串是一個十六進制數字(這似乎是)和財產的非隨機的部分不包括數字:

((?:\S+.)*)(?:[0-9A-Fa-f]+.)?((?:\S+.?)+) 

所以第一組前應隨機皮卡一切數字(包括尾隨點)第二組將吃隨機數,然後第三組將匹配剩餘的字符串(或者如果沒有隨機數字部分則整個事件)。

編輯

隨着問題的更新說明,只有匹配兩組我的回答是,這是不可能的。在正則表達式中,沒有任何機制可以「擦除」部分匹配。從問題的定義是不包含的關鍵部分是在其他文本即:普通模式相匹配的中間是:

((a)(?:b)(c)) 

因爲我們不能預先或後處理「b」將始終是包含a和c的較大匹配組的一部分,因此它是不匹配的組並不影響較大的組。

+0

嗨,我需要的結果是第一和第三組連接不在不同的組。在我有的應用程序中,我只能指定兩個組,一個用於Key,另一個用於值。 – rojanu 2010-06-18 14:20:00

+0

然後我會改變我的答案爲「不可能」(見編輯) – 2010-06-21 12:01:54

0

規範還不是很清楚,但這裏是我要承擔:

  • #在該行的開頭評論
  • 的「鑰匙」最多可以有3份,由一個立即.
    • 中間部分分離是一個可選的「垃圾」
  • 「密鑰」是FOLL通過=欠款,那麼「值」
  • .=有特殊標記至少要等到「價值」的一部分,在那裏那麼一切都
  • 允許空格

那麼也許格局是這樣的工作原理:

String text = 
     " some.stuff.here = blah blah \n" + 
     " awesome.key = { level = 10 } \n" + 
     "# awesome.key = { level = 11 } \n" + 
     " awesome..key = { level = 12 } \n" + 
     " [email protected]#$.)(*&.$%& = a=b=c.d=f "; 

    Pattern p = Pattern.compile(
     "(?m)^(?!#) (key)@(?:[email protected])?(key) = (value) $" 
      .replace("@", "\\.") 
      .replace(" ", "\\s*") 
      .replace("key", "[^.=\\s]*") 
      .replace("value", ".*?") 
    ); 

    Matcher m = p.matcher(text); 
    while (m.find()) { 
     System.out.printf("%s.%s => [%s]%n", 
      m.group(1), 
      m.group(2), 
      m.group(3) 
     ); 
    } 

此打印:

some.here => [blah blah] 
awesome.key => [{ level = 10 }] 
awesome.key => [{ level = 12 }] 
[email protected]#$.$%& => [a=b=c.d=f] 

注意replace方法來生成最終的正則表達式模式;它用於增強整體大圖片「模式」的可讀性

+0

對不起,我應該更加精確。我正在更新這個問題 – rojanu 2010-06-18 14:41:24