gpt4 book ai didi

regex - 与Scala中的正则表达式匹配

转载 作者:行者123 更新时间:2023-12-03 08:55:22 25 4
gpt4 key购买 nike

我经常将字符串与正则表达式匹配。在Java中:

java.util.regex.Pattern.compile(“\ w +”)。matcher(“this_is”)。matches

哎哟。 Scala有很多选择。

  • "\\w+".r.pattern.matcher("this_is").matches
  • "this_is".matches("\\w+")
  • "\\w+".r unapplySeq "this_is" isDefined
  • val R = "\\w+".r; "this_is" match { case R() => true; case _ => false}

  • 第一个与Java代码一样重。

    第二个问题是您无法提供已编译的模式( "this_is".matches("\\w+".r"))。 (这似乎是一种反模式,因为几乎每当有一个方法使用正则表达式进行编译时,都会有一个使用正则表达式的重载)。

    第三个问题是,它滥用了 unapplySeq并因此是隐秘的。

    分解正则表达式的各个部分时,第四点很棒,但是当您只需要 bool(boolean) 结果时,第四点就太笨重了。

    我是否缺少一种简单的方法来检查正则表达式是否匹配?有没有为什么不定义 String#matches(regex: Regex): Boolean的原因?实际上, String#matches(uncompiled: String): Boolean在哪里定义?

    最佳答案

    您可以定义这样的模式:

    scala> val Email = """(\w+)@([\w\.]+)""".r
    findFirstIn如果匹配则返回 Some[String],否则返回 None
    scala> Email.findFirstIn("test@example.com")
    res1: Option[String] = Some(test@example.com)

    scala> Email.findFirstIn("test")
    rest2: Option[String] = None

    您甚至可以提取:
    scala> val Email(name, domain) = "test@example.com"
    name: String = test
    domain: String = example.com

    最后,您还可以使用常规的 String.matches方法(甚至回收先前定义的 Email Regexp:
    scala> "david@example.com".matches(Email.toString)
    res6: Boolean = true

    希望这会有所帮助。

    关于regex - 与Scala中的正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8301858/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com