我正在编写一个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逃逸?另外,方括号在测试输出中来自何处?
答案 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包含一个有效的代码示例。