我正在编写一个 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 逃逸?另外,测试输出中的方括号是从哪里来的?