【问题标题】:Scala regular expression : matching a long unicode Devanagari pattern failsScala 正则表达式:匹配长的 unicode 梵文模式失败
【发布时间】:2015-03-28 13:54:57
【问题描述】:

考虑以下脚本代码: 导入 scala.util.matching.Regex

val VIRAMA = "्"
val consonantNonVowelPattern = s"(म|त|य)([^$VIRAMA])".r
// val consonantNonVowelPattern = s"(थ|ठ|छ|स|ब|घ|ण|ट|ज|ग|न|ष|भ|ळ|ढ|ख|श|प|ह|ध|ङ|म|झ|ड|ल|व|र|फ|क|द|च|ञ|त|य)([^$VIRAMA])".r
var output = "असय रामः "
output = consonantNonVowelPattern.replaceAllIn(output, _ match {
  case consonantNonVowelPattern(consonant, followingCharacter) =>
    consonant + VIRAMA + "a" + followingCharacter
})
println("After virAma addition: " + output.mkString("-"))

它产生以下正确的输出: After virAma addition: अ-स-य-्-a- -र-ा-म-्-a-ः-

但是,如果我使用较长的模式(上面已注释掉),则会得到以下错误输出: After virAma addition: अ-स-्-a-य- -र-्-a-ा-म-्-a-ः-

这是一个错误吗?我做错了吗?

【问题讨论】:

  • 您是否尝试过(?=[^$VIRAMA]) 而不是([^$VIRAMA]) 或类似的东西?正则表达式使用followingCharacter 标识的组,前瞻组不使用。我不确定这是否能解决它……这只是一个猜测……
  • 这个问题,即“全部”意味着“全部不重叠”,导致此文档为findAllIn 而不是replaceAllIn。该建议与其他评论中的一样。 scala-lang.org/files/archive/nightly/2.11.x/api/2.11.x/…

标签: regex scala unicode


【解决方案1】:

以下感谢Lalit Pant-

我假设第二种情况的正确输出是: अ-स-्-a-य-्-a- -र-्-a-ा-म-्-a-ः-

如果是这样,请继续阅读。如果没有,请告诉我预期的输出。

问题似乎是,对于较大的“consonantNonVowelPattern”,“输出”中“सय”的存在使得“य”在“स”辅音之后的模式匹配中显示为“跟随字符”。因此,'य' 从未被报告为辅音。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-15
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    相关资源
    最近更新 更多