我正在尝试使用JS(我还很陌生)编写的脚本,在该脚本中,用户可以在x-SAMPA中输入一个字符串(用于转录发音的符号),并在IPA中输出相应的字符串,另一个例如符号。没有任何明显更好的方法,我有一个(很大)字典,将每个x-SAMPA字符映射到其IPA对应项。 (出于完整性考虑,https://pastebin.com/srjEYAGU)我还希望能够交换键/值对并将表重新用于IPA ---> x-SAMPA。
由于str.replace()
仅替换了第一个实例(需要全局搜索),因此我正在尝试匹配字符串变量,而不是字符串 literal ,我想我必须使用RegExp()
:
sInput = "TIs TIN Iz r\\ON"
Object.keys(xsampaToIPAMain).forEach(function(key) {
sInput = sInput.replace(new RegExp(key, 'g'), xsampaToIPAMain[key]);
});
console.log(sInput);
但是,1)x-SAMPA不是声音和字符之间的1:1对应;在这种情况下,两个字符“ r \”共同指代一种声音,因此我不能只逐个字符地替换,而且2)x-SAMPA包含许多特殊的正则表达式字符。特别是,一旦它以反斜杠到达表中的第一个键:
"h\\": "ɦ",
正则表达式抛出错误:
"Invalid regular expression: /h\/: \ at end of pattern"
进行搜索似乎正则表达式首先将\\
转义为\
,然后尝试转义下一个字符,因此要查找的模式实际上是h\\\\
。
我无法搜索类似key+"\\"
之类的东西,因为大多数键没有任何反斜杠来尝试变通,因此它们只会使正则表达式崩溃。
然后还有其他特殊的正则表达式字符,例如?
和}
和.
,它们也是x-SAMPA字符,需要转义,但据我所知,不需要与反斜杠相同)。
所以- 用需要转义的特殊正则表达式字符替换长度可变的可变字符串的所有实例的最简单方法是什么?