LaTeX umlaut的正则表达式逃脱?

时间:2013-11-15 09:46:23

标签: java regex scala latex

我正在编写一个Scala脚本,它从多个来源获取信息,包括BibTeX文件。使用jbibtex library解析文件。

我的BibTeX源文件包含非ASCII字母的LaTeX样式转义符,例如

  

作者= {Fjeld,Morten和Sch \“{a} r,Sissel Guttormsen}

我尝试使用简单的替换,但失败了,因为我无法编写正确的正则表达式以匹配转义。

我能想到的最好的是

val stringWithEscapedUmlaut = """Sch\"{a}r"""
val properString = stringWithEscapedUmlaut.replaceAll("""\\"\{a}""", "ä") 

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

  

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ößeinderKüche' * FAILED *     “K [\äsekl\ößeinder K]üche”并不等于“K [äseklößeinder K]üche”

这里发生了什么,如何解决这个问题,以便覆盖变音符号和scharfes es逃逸?另外,方括号在测试输出中来自何处?

3 个答案:

答案 0 :(得分: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 :(得分: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
  }  

}

答案 2 :(得分:1)

JBibTeX库提供LaTeX解析器(将LaTeX字符串转换为LaTeX命令列表)和LaTeX pretty打印机(将LaTeX命令列表转换为Java unicode字符串)类。所以,这里没有必要搞乱正则表达式。

README file包含一个有效的代码示例。