2014-03-07 56 views
2

我有以下示例文本:解析文本與象%NAME%變量,它

Peter Miller - Product Management ### 20000 

現在我不想讓我的用戶定義一個簡單的匹配模式與百分比字符的幫助,如:

%NAME% - %JOB% ### %AMOUNT% 

變量的順序和它們之間的字符可以改變! 有沒有人知道現有的準備使用這個匹配問題的實現?我認爲RegExp對此是錯誤的方法。

+1

爲什麼'RegExp'錯誤的做法? – christopher

+1

@christoper,我認爲這不像創建自動創建的RegExps那麼簡單。看看這個例子 - %NAME - %JOB% - %AMOUNT% - 你必須編寫一個匹配所有輸入變量和文本的創建算法 –

回答

3

我認爲你可以從你的模式創建一個正則表達式,並將其與文本進行匹配。

下面是一個簡單的例子:

public static Map<String, String> match(final String pattern, final String text) { 
    final StringBuilder regexp = new StringBuilder("^"); 

    final List<String> varNames = new LinkedList<String>(); 
    int i=0; 
    for (final String subPart : pattern.split("%", -1)) { 
     if (i++%2!=0) { 
      regexp.append("(.*)"); 
      varNames.add(subPart); 
     } else { 
      regexp.append(Pattern.quote(subPart)); 
     } 
    } 
    regexp.append("$"); 

    final Pattern p = Pattern.compile(regexp.toString()); 
    final Matcher m = p.matcher(text); 


    final Map<String, String> matched = new HashMap<String, String>(); 
    if (m.matches()) { 
     int j=1; 
     for (final String varName : varNames) { 
      matched.put(varName, m.group(j++)); 
     } 
    } 

    return matched; 
} 

你可以把它像:

public static void main(String[] args) { 
    final String pattern = "%NAME% - %JOB% ### %AMOUNT%"; 
    final String text = "Peter Miller - Product Management ### 20000"; 

    for (final Entry<String, String> e : match(pattern, text).entrySet()) { 
     System.out.println(e.getKey()+"\t"+e.getValue()); 
    } 
} 

,輸出是:

NAME Peter Miller 
JOB Product Management 
AMOUNT 20000 
+1

令人驚歎!似乎工作正常!非常感謝! –