2013-11-15 1 views
2

BibTeX 파일을 비롯하여 여러 소스에서 정보를 가져 오는 Scala 스크립트를 작성하고 있습니다. jbibtex library을 사용하여 파일을 구문 분석하십시오.LaTeX 움라우트 이스케이프 용 정규식?

나의하여 BibTex 소스 파일은 LaTeX의 스타일

저자 = {Fjeld, 모르 텐 및 모델명 : SCH \ "{A} R, Sissel의 Guttormsen}

I와 같은 비 ASCII 문자에 대한 이스케이프 포함 간단한 교체를 사용하려고하지만 탈출에 맞게 적절한 정규식을 쓸 수 없기 때문에 실패했습니다.

내가

했다 가지고 올 수있는 최선을3210

하지만 정규식 엔진이 일치하는 것에 대해 불평합니다.

java.util.regex.PatternSyntaxException : 인덱스에 가까운 불법 반복이 \ "{A} 지금까지 내가, 내가 \ 및 정규식에 { 아니지만을 알고 탈출해야하고 같은

" 또는 }은. 그럼에도 불구하고, 나는 더 이스케이프 점점 임의의 장소에서 백 슬래시 :(하지만 성공을 추가했습니다.

모든 아이디어를 어떻게 일치하는?

업데이트 A-Umlaut 탈출을위한 해결책은 간단합니다 (Keppil에게 감사드립니다). 그것은

replace("\"{a}", "ä") 

입니다 그러나 LATEX은 또한 ß 예를 들어 \{ss}를 들어, 다른 문자가 빠져 있습니다.

스칼라에서는 문자열에서 "{ss}"을 사용할 수 없으므로 원시 문자열 ""{ss} "" "을 사용하려고했습니다. 그런 다음 전체 교체품이 떨어져 나옵니다.

object Converter { 

    def cleanLatexEscapes(rawString: String): String = { 
    val aumlauts = rawString.replace("\"{a}", "ä") 
    val oumlauts = aumlauts.replace("\"{o}", "ö") 
    val uumlauts = oumlauts.replace("\"{u}", "ü") 
    val scharfesEs = uumlauts.replace("""\{ss}""", "ß") 

    return scharfesEs 
    } 

} 

import org.scalatest._ 

class ConverterSpec extends FlatSpec { 
    "cleanLatexEscapes" should "clean 'Käseklöße in der Küche'" in { 
    val escaped = """K\"{a}sekl\"{o}\{ss}e in der K\"{u}che""" 
     val cleaned = Converter.cleanLatexEscapes(escaped) 
     assert(cleaned === "Käseklöße in der Küche") 
    } 
} 

cleanLatexEscapes - 청소해야 '데르의 Käseklöße Küche'* 실패 * "K [\ äsekl \ OSSE 데르에서 K] 우체"하지 않았다 동일한 "K [데르 K에서 äseklöße] üche "

여기에서 무슨 일이 일어나고 어떻게 움라우트와 에스 케이프 모두 이스케이프가 적용되도록 수정해야합니까? 또한, 테스트 결과에서 대괄호는 어디에서 왔습니까?

답변

2

여기에 정규 표현식에 대한 필요, 당신은 replace() 대신 replaceAll() 사용할 수 없습니다 :

val author = "author = {Fjeld, Morten and Sch\"{a}r, Sissel Guttormsen}" 
println(author.replace("\"{a}", "ä")) 

당신이 정말로 replaceAll()를 사용하려는 경우, 당신은 탈출 할 필요가 모두 {} :

val author = "author = {Fjeld, Morten and Sch\"{a}r, Sissel Guttormsen}" 
println(author.replaceAll("\"\\{a\\}", "ä")) 

편집

리터럴 \"과 같은 방식 즉, 다른 백 슬래시로 이스케이프됩니다. 위의 설명 모든 시퀀스를 청소하려면, 당신은 사용할 수 있습니다

val cleaned = escaped.replace("\"{a}", "ä").replace("\"{o}", "ö").replace("\"{u}", "ü").replace("\\{ss}", "ß"); 
+1

죄송합니다. 움라우트에 대해서만 모든 이스케이프에 대해 작동하지 않으므로 허용 된 표시를 제거해야했습니다. 어쩌면 당신은 그것을 모두 커버 할 수있는 대답을 확장 할 수 있습니까? 질문에 더 많은 정보를 올렸습니다. 저는 여전히 스칼라에 대해 매우 새롭고, 전체 이탈 메커니즘이 어떻게 작동하는지 정확하게 알지 못합니다. – rumtscho

1

을 대체 읽어야합니다

object Converter { 

    def cleanLatexEscapes(rawString: String): String = { 
    val aumlauts = rawString.replace("\\\"{a}", "ä") 
    val oumlauts = aumlauts.replace("\\\"{o}", "ö") 
    val uumlauts = oumlauts.replace("\\\"{u}", "ü") 
    val scharfesEs = uumlauts.replace("\\{ss}", "ß") 

    return scharfesEs 
    } 

} 
1

JBibTeX 라이브러리 라텍스 파서를 제공은 및 유액 (라텍스 명령의 목록에 LaTeX의 문자열로 변환) 귀여운 프린터 (LaTeX 명령 목록을 Java 유니 코드 문자열로 변환) 클래스. 그래서 여기 정규식을 망칠 필요가 없습니다.

README file에는 작동 코드 예제가 들어 있습니다.

관련 문제