2013-11-15 57 views
2

我正在写一个Scala脚本,它从几个来源获取信息,包括一个BibTeX文件。使用jbibtex library解析文件。正则表达式为LaTeX变音符逃脱?

我的中文提供源文件中包含的LaTeX风格逃逸非ASCII字符,如

笔者= {Fjeld,莫滕和SCH \“{一} R,西塞尔Guttormsen}

我试图用简单的更换,但失败了,因为我不能写一个适当的正则表达式来匹配逃逸。

我能想出是

最好3210

但正则表达式引擎抱怨比赛。

java.util.regex.PatternSyntaxException:近指数非法重复2 \“{A}

据我所知,我应该逃避\和正则表达式{,但不"}。不过,我尝试添加在日益随机的地方更多逃生的反斜杠:(但没有成功。

任何想法如何搭配呢?

更新 A-Umlaut转义解决方案非常简单(谢谢你Keppil)。这是

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

但LaTeX的也有其他字符转义,例如\{ss}ß

Scala不会让我在字符串中使用“{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 [\äsekl\奥塞在德K]乌切” 不等于“K [äseklöße在德K] üche“

这里发生了什么,我该如何解决这个问题,这样才能涵盖变音器和scharfes es逃生?另外,方括号在测试输出中来自哪里?

回答

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

对不起,我不得不删除接受的标记,因为这不适用于所有逃脱,只适用于元音变音。也许你可以扩展答案来覆盖这一切?我在问题中发布了更多信息。我对Scala仍然很陌生,并不确定整个逃生机制的工作原理。 – 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的字符串转换为LaTeX命令的列表)和LaTeX漂亮的打印机(将LaTeX命令列表转换为Java unicode字符串)类。所以,这里没有必要混淆正则表达式。

README file包含一个工作代码示例。