【问题标题】:scalajs regular expression with Unicode property \\pL or \\p{L}具有 Unicode 属性 \\pL 或 \\p{L} 的 scalajs 正则表达式
【发布时间】:2021-11-08 23:34:26
【问题描述】:

需要任何语言的字母的正则表达式。 \pL 或 \p{L} 在 Ammonite Repl 1.6.8 (Scala 2.13.0 Java 11.0.8) 中工作

@ "\\pL+".r.findFirstIn("abcßäöñ") 
res1: Option[String] = Some("abc\u00df\u00e4\u00f6\u00f1")

@ "\\p{L}+".r.findFirstIn("abcßäöñ") 
res2: Option[String] = Some("abc\u00df\u00e4\u00f6\u00f1")

但 Unicode 属性在 Scalajs (1.5.1) 中不起作用,即结果为 None。 任何帮助表示赞赏。 谢谢

【问题讨论】:

    标签: regex unicode scala.js


    【解决方案1】:

    好的,文档中不支持 Unicode

    【讨论】:

      【解决方案2】:

      您可以更改目标 ECMAScript 版本,在以下设置中进行更改:

      scalaJSLinkerConfig ~= (_.withESFeatures(_.withESVersion(ESVersion.ES2018)))
      

      另外,您可能需要在 build.sbt 中添加 val ESVersion = org.scalajs.linker.interface.ESVersion

      然后就可以使用了

      "(?U)\\p{L}+".r.findFirstIn("abcßäöñ")
      "(?U)[^\\W\\d_]+".r.findFirstIn("abcßäöñ")
      "(?U)\\p{Alpha}+".r.findFirstIn("abcßäöñ")
      

      (?U) 标志是 UNICODE_CHARACTER_CLASS 嵌入标志选项,它使 \w\s\p{Alpha} 等类可识别 Unicode。 [^\W\d_] 是一个匹配除数字和下划线以外的任何单词字符的类,所以基本上是字母。 \p{Alpha}/\p{L} 将只匹配字母。

      【讨论】:

        【解决方案3】:

        从 Scala.js 1.7.0 开始,有条件地支持 Unicode 属性,例如 \p{L} 或其缩写形式 \pL。只有以下 sbt 设置才支持它们:

        scalaJSLinkerConfig ~= (_.withESFeatures(_.withESVersion(ESVersion.ES2018)))
        

        (如果使用其他构建工具,请参考该构建工具指定 Scala.js 链接选项的方式。)

        启用该设置后,唯一不受支持的 \p{x} 属性是 x 的形式为 In???? 并且 ???? 表示 Unicode L 不是In... 的形式,所以支持。

        参考:the Scala.js documentation on regex support

        有条件支持

        [...]

        以下功能需要esVersion >= ESVersion.ES2018(即 默认为false):

        • [...]
        • \p{????} 表达式,其中 ???? 不是 POSIX 字符类之一。

        【讨论】:

          猜你喜欢
          • 2013-01-31
          • 2018-10-15
          • 1970-01-01
          • 2011-04-02
          • 1970-01-01
          • 2010-12-22
          • 2013-07-09
          • 2011-01-04
          相关资源
          最近更新 更多