Scala Escape Character Regex

时间:2016-11-30 05:11:00

标签: regex scala escaping character

如何编写表达式来过滤输入,使其格式为 (AAA)其中A是0-9的数字。 EX:(123),(592),(999)

1 个答案:

答案 0 :(得分:1)

通常你想做的不仅仅是过滤。

scala> val r = raw"\(\d{3}\)".r
r: scala.util.matching.Regex = \(\d{3}\)

scala> List("(123)", "xyz", "(456)").filter { case r() => true case _ => false }
res0: List[String] = List((123), (456))

scala> import PartialFunction.{cond => when}
import PartialFunction.{cond=>when}

scala> List("(123)", "xyz", "(456)").filter(when(_) { case r() => true })
res1: List[String] = List((123), (456))

保持每个输入的所有匹配:

scala> List("a(123)b", "xyz", "c(456)d").flatMap(s =>
     | r.findAllMatchIn(s).map(_.matched).toList)
res2: List[String] = List((123), (456))

scala> List("a(123)b", "xyz", "c(456)d(789)e").flatMap(s =>
     | r.findAllMatchIn(s).map(_.matched).toList)
res3: List[String] = List((123), (456), (789))

保持第一个:

scala> val r = raw"(\(\d{3}\))".r.unanchored
r: scala.util.matching.UnanchoredRegex = (\(\d{3}\))

scala> List("a(123)b", "xyz", "c(456)d(789)e").flatMap(r.unapplySeq(_: String)).flatten
res4: List[String] = List((123), (456))

scala> List("a(123)b", "xyz", "c(456)d(789)e").collect { case r(x) => x }
res5: List[String] = List((123), (456))

保持匹配的整行:

scala> List("a(123)b", "xyz", "c(456)d(789)e").collect { case s @ r(_*) => s }
res6: List[String] = List(a(123)b, c(456)d(789)e)

Java API:

scala> import java.util.regex._
import java.util.regex._

scala> val p = Pattern.compile(raw"(\(\d{3}\))")
p: java.util.regex.Pattern = (\(\d{3}\))

scala> val q = p.asPredicate
q: java.util.function.Predicate[String] = java.util.regex.Pattern$$Lambda$1107/824691524@3234474

scala> List("(123)", "xyz", "(456)").filter(q.test)
res0: List[String] = List((123), (456))