2016-01-20 15 views
2

我用空格分割一個字符串,然後檢查每個部分是否包含代碼(& a,& l等)。如果匹配,我必須抓住彼此相鄰的代碼,然後按字母數字順序排列(0,1,2 ... a,b,c ...)。對Bukkit ChatColor表達式進行匹配和排序

這裏是我試過到目前爲止:

String message = "&l&aCheckpoint&m&6doreime"; 
String[] parts = message.split(" "); // This may not be needed for the example, but I'm only using one word for simplicity here 
List<String> orderedMessage = new ArrayList<>(); 
Pattern pattern = Pattern.compile("((?:&|\u00a7)[0-9A-FK-ORa-fk-or])(.*?)"); // Completely matches the entire pattern, not what i want 

for (String part : parts) { 
    if (pattern.matcher(part).matches()) { 
     List<String> orderedParts = new ArrayList<>(); 
     // what do i do? 
    } 
} 

我需要,使其符合這樣的團體來改變pattern值:

Match: &l&aCheckpoint 
Groups that I need: [&l, &a, Checkpoint] 

Match: &m&6doreime 
Groups that I need: [&m, &6, doreime] 

我如何在每個顯示Match匹配,並把它分解分成3組(在這裏它將每個代碼段(&[0-9A-FK-ORa-fk-or])和其餘的文本分割成另一個代碼段)?

信息:對於任何想知道爲什麼,當您將顏色/格式編碼文本提交給我的世界時,顏色必須先到達,或格式([a-fk-or])代碼因爲Minecraft自1.5分析顏色代碼的方式而被忽略。通過整理它們並重建消息,它不會依賴用戶或開發人員獲得正確的訂單。

回答

1

你可以得到你是什麼後,使用稍微複雜一點的正則表達式

(((?:&|§)[0-9A-FK-ORa-fk-or])+)([^&]*) 

其分解,我們有兩個重要的捕獲組

(((?:&|§)[0-9A-FK-ORa-fk-or])+) 

這將捕獲的一個或多個代碼段和&後跟一個字符

([^&]*) 

第二次抓取任何數量的非&字符,這將使您得到該部分的其餘部分。 (這是稍有不同的行爲比你所提供的正則表達式 - 事情變得更加複雜,如果&是串在一個合法的字符

把該正則表達式投入使用了匹配器,你可以做到以下幾點,

String input = "&l&aCheckpoint&m&6doreime"; 
    Pattern pattern = Pattern.compile("(((?:&|§)[0-9A-FK-ORa-fk-or])+)([^&]*)"); 
    Matcher patternMatcher = pattern.matcher(input); 
    while(patternMatcher.find()){ 
     String[] codes = patternMatcher.group(1).split("(?=&)"); 
     String rest = patternMatcher.group(3); 
    } 

這將循環兩次,讓您

codes = ["&l", "&a"] 
    rest = "Checkpoint" 
第一循環

,並在第二

codes = ["&m", "&6"] 
    rest = "doreime" 
以下
+0

當你用'(?=&)'分割代碼時,我怎樣才能用1或2個&分割它。例如:'&& l && a&mCheckpoint'將爲代碼顯示'[&,&l,&&a,&m]',但我想要'[&& l,&& a,&m]'。 –

+0

如果你想這樣做,你可以在主正則表達式的&選項後面加上字符,即'(((?:&|§)[0-9A-FK-ORa-fk-or]?)+) ([^&] *)' (注意?字符匹配之後) 這將使'&&升&&一個&mCheckpoint'顯示 '[&,&L,&,重組,和米],Checkpoint' –

+0

我切換的代碼將正則表達式拆分爲負面後視圖'(?<!&)',它實現了我所期待的。謝謝您的幫助。 –