2017-04-07 8 views
1

기본적으로 PHP의 간단한 markdown regex 파서 인이 https://gist.github.com/jbroadway/2836900의 Java 포트가 필요합니다.메소드 매개 변수에 자바 역 참조 전달

내가 역 참조를 사용할 수 있기를 바랬으나 제대로 작동하지 않을 수 있습니다. 현재 HashMap을 사용하지 않고 있는데 ChangeListener을 통해 텍스트를 가져오고 설정하는 JavaFX TextArea이 2 개 있습니다.

{ //... 
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입니다.

이 ID는이 스타일을 유지할 수있는 솔루션을 생각하고 별도로 처리 할 필요가 없습니다.

+0

코드에 문제가 있습니다. 일치시키려는 샘플 텍스트를 보여줄 수 있습니까? '$ 1' 포착 그룹은'$ 0'이 아닌 최초로 매칭 된 그룹입니다 (전체 입력 문자열 일 수도 있음). 또한 패턴'(# +) (. *)'에는 세 가지가 아니라 두 개의 캡처 그룹 만 있습니다. –

+0

@TimBiegeleisen 완전 일치 식인 캡처 그룹 0이 아닌가? –

+0

@RobbyCornelissen OP가 전체 문자열을 사용하려고한다는 것은 확실하지 않습니다. 몇 가지 샘플 데이터를보고 싶습니다. –

답변

2

문제는 역 참조 값이 대체 문자열에만 적용된다는 것입니다. 따라서 header() 메서드에 전달되는 값은 $0, $1$2 리터럴이며 캡처 된 값이 아닙니다. 람다 표현식을 받아 replaceAll()의 어떤 버전이 없기 때문에

, 나는 당신의 최선의 방법은 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>