2016-11-30 13 views
-1

式を入力して、 (AAA)の形式になるように入力をフィルタ処理する方法を教えてください。ここでAは0-9の数値です。 EX:(123)、(592)、(999)Scalaエスケープ文字正規表現

+0

逆参照 '(\ d)\ 1 *' – Tushar

答えて

0

は、通常は、そのような"[0-9]".rとして、文字列上で利用可能な.r方法を使用して正規表現を作成します。しかし、あなたが気づいたように、それはあなたが正規表現ではなく文字列にエスケープ文字を挿入したいとパーザが考えているので、エスケープ文字を補間することができないことを意味します。

このために、バックスラッシュと改行を含む正確な文字列の文字列を作成するScalaの三重引用符付き文字列を使用できます。 あなたのように正規表現を作成するには、"""\(\d\d\d\)""".rと書くことができます。使用中の例は次のとおりです。

val regex = """\(\d\d\d\)""".r.pattern 
Seq("(123)", "(---)", "456").filter(str => regex.matcher(str).matches) 
+0

または 'リスト("(123) "、" xyz "、"(456) ")フィルター(pattern.asPredicate.test)'またはそれに類するもの。 –

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/[email protected] 

scala> List("(123)", "xyz", "(456)").filter(q.test) 
res0: List[String] = List((123), (456)) 
関連する問題