2017-04-07 46 views
1

我需要這個https://gist.github.com/jbroadway/2836900的Java端口,它基本上是一個PHP中簡單的Markdown正則表達式解析器。將Java反向傳遞給方法參數

我希望我可以使用反向引用,但我不能使它工作。 目前我沒有使用HashMap,我有2個JavaFX TextArea s,我將通過ChangeListener獲取並設置文本。

{ //... 
htmlTextArea.setText(markdownTextArea.getText() 
    .replaceAll("(#+)(.*)", header("$0", "$1", "$2")); 
} 

private String header(String text, String char, String content) { 
    return String.format("<h%s>$2</h%s>", char.length(), char.length()); 

$ 2的反向引用只有在返回時才起作用,但其他反向引用不起作用。 char.length()始終爲2,因爲它被視爲$2而不是反向引用。

我喜歡想一個解決方案,我可以保持這種風格,不需要分開處理。

+0

你的代碼有問題。你能向我們展示一個你正在嘗試匹配的示例文本嗎? '$ 1'捕獲組是第一個匹配的組,而不是'$ 0'(可能是整個輸入字符串)。另外,你的模式'(#+)(。*)'只有兩個捕獲組,而不是三個。 –

+0

@TimBiegeleisen是不是捕獲組0應該是完全匹配的表達式? –

+0

@RobbyCornelissen我不清楚OP是否打算使用整個字符串,我希望看到一些示例數據。 –

回答

2

問題是反向引用值只在替換字符串中才有效。因此,傳遞給您的header()方法的值是$0,$1$2文字,而不是捕獲的值。

既然沒有版本的replaceAll()接受lambda表達式,我認爲最好的方法是使用一個Matcher對象:

String text = "###Heading 3"; 
Pattern p = Pattern.compile("(#+)(.*)"); 
Matcher m = p.matcher(text); 
StringBuffer out = new StringBuffer(); 

while(m.find()) { 
    int level = m.group(1).length(); 
    String title = m.group(2); 

    m.appendReplacement(out, String.format("<h%s>%s</h%s>", level, title, level)); 
} 

m.appendTail(out); 

System.out.println(out.toString()); 

對於給定的輸入,這樣打印出:

<h3>Heading 3</h3>