2012-09-26 149 views
1

我有什麼不對?當我設置變量參數=「月」時,我需要得到333#444,但我得到:333#444:JUPITER = 555。所以我一次只需要一個值。根據鑰匙獲得價值

final String parameters = "WORLD=111#222:MOON=333#444:JUPITER=555:SATURN=666:"; 
final String param = "MOON"; 

Pattern pattern = Pattern.compile("(.*)(" + param + ")=(.*)(:+)(.*)"); 
Matcher matcher = pattern.matcher(parameters); 

if(matcher.matches()) { 
    System.out.println("3: " + matcher.group(3)); // Value that I needed: 333#444 
} 

謝謝。

+0

不論您是否已接受或任何答案已被接受,你應該更新您的疑問句的讓你清楚你在問什麼。包括你的要求是什麼,一些不應該匹配的例子,以及應該是什麼。否則這個問題將來無法幫助其他人。 – Sepster

回答

1

我不能完全肯定,但也許你想要的是提取所有的key = value字段?如果是這種情況,您應該將字符串拆分爲:字符,並自行處理所有部分。然後將這些字符串部分與正則表達式([^=]+)=(.*)進行匹配,或者更好地簡單地將每個部分拆分爲=字符。在這種情況下,你甚至不需要正則表達式,並且可能節省程序執行時間!通過搜索MOON可輕鬆找到MOON= ...的表達式。

編輯:我做了以下的舊Java風格的測試程序(最有可能可以改善):

class Test 
{ 
     public static void main(String argv[]) 
     { 
       String parameter="WORLD=111#222:MOON=333#444:JUPITER=555:SATURN=666"; 
       String[] elements=parameter.split(":"); 
       for (int i=0; i < elements.length; i++) { 
         String[] parts=elements[i].split("=", 2); 
         if ((parts.length == 2) && (parts[0].equals("MOON"))) { 
           System.out.println("MOON is "+parts[1]); 
         } 
       } 
     } 
}; 

輸出:

MOON is 333#444 

在使用正則表達式很多情況下是矯枉過正,通常可以避免它,並節省執行時間。如果你有一個很長的字符串,你可能只是搜索MOON,然後從那裏搜索下一個:或字符串結束,然後使用split,但我可能會在這種情況下使用正則表達式。這一切都取決於你是否需要其他領域。

+0

我只想提取具體的鍵=值。所以你的評論的第一部分是正確的,但我需要兩個septs:1.分裂,2. reges。 – Ziletka

+0

我會檢查我的生鏽的Java技能,看看我能不能掀起一個例子...敬請期待。 – hochl

+1

我會使用'split(「=」,2);'如果值包含'=' –

1

.*是貪婪的,所以它得到了很多,不是一點點,因爲它可以。

嘗試.*?[^:]*

+0

+1 - 另一個術語是「貪婪」,以防你在任何地方查找它。 – Sepster

+0

正確。 'eager'是我剛剛在我的代碼中玩的一個術語。 ;) –

+0

是的,謝謝,我將使用「(。* MOON =)(。*?)(:+。*)」,其中MOON將是參數不硬編碼的字符串。 – Ziletka

1

如果你只333#444後的時候,那麼這個工程:

MOON=([0-9]+#[0-9]+)

這將讓你MOON=333#444

(MOON=[0-9]+#[0-9]+)

但不知道你在做什麼明確後,可能的值/格式可能是MOON的價值,該列表可能繼續;-)

此:([A-Z]+?=[0-9]+(#[0-9]+)?)

會得到你:

WORLD=111#222WORLD=111#222

MOON=333#444MOON=333#444

JUPITER=555

SATURN=666

,和本:([A-Z]+?)=([0-9]+(#[0-9]+)?)

會得到你:

WORLD111#222#222

MOON333#444#444

JUPITER555

SATURN666

混合,匹配,漂洗,重複;-)

0

我不知道性能,但很容易讀取,並且它的外觀,它的工作原理: 更新2012-09-27:添加「或文本的結束」 ... | $

final String parameter5 = "WORLD=111#222:MOON=333#444:JUPITER=555:SATURN=666:";   
final String P = "MOON"; 

Pattern pattern = Pattern.compile("(.*" + P + "=)(.*?)(:+.*|$)"); 
Matcher matcher = pattern.matcher(parameter5); 

if (matcher.matches()) { 
    System.out.println(matcher.group(2)); // 333#444 
} 
+0

由於你回答自己的問題,你真的應該更新你的問題,澄清我們一直在試圖回答你的問題;-) – Sepster