2

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

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

作者 = {Fjeld, Morten and Sch\"{a}r, Sissel Guttormsen}

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

我能想到的最好的办法是

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

但正则表达式引擎抱怨匹配。

java.util.regex.PatternSyntaxException:索引 2 附近的非法重复 \"{a}

据我所知,我应该转义\{使用正则表达式,而不是"or }。尽管如此,我尝试在越来越随机的地方添加更多的转义反斜杠:(但没有成功。

任何想法如何匹配这个?

更新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 in der Küche' * 失败 * "K[\äsekl\öße in der K]üche" 不等于 "K[äseklöße in der K]üche"

这里发生了什么,我该如何解决它,以便覆盖变音符号和 scharfes es 逃逸?另外,测试输出中的方括号是从哪里来的?

4

3 回答 3

2

这里不需要正则表达式,您可以使用replace()代替replaceAll()

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

如果您真的想使用replaceAll(),则需要同时转义{and }

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

编辑

文字\以与 a 相同的方式转义",即使用另一个反斜杠。要清理您上面描述的所有序列,您可以使用:

val cleaned = escaped.replace("\"{a}", "ä").replace("\"{o}", "ö").replace("\"{u}", "ü").replace("\\{ss}", "ß");
于 2013-11-15T09:49:35.070 回答
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
  }  

}
于 2013-11-15T11:06:45.797 回答
1

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

自述文件包含一个工作代码示例。

于 2014-05-18T09:44:34.430 回答