文字列のリストと正規表現パターンがあります。リストから正規表現に一致しないアイテムをフィルタリングしたいと思います。動作していないように見える次のコードを使用しています。
val matching = token.filter(x => regex.pattern.matcher(x).matches)
トークンは文字列のリストで、正規表現は一致させたいパターンです
コードは機能するはずです。正規表現が正しいことを確認しますか?
val regex = "a.c".r
val tokens = List("abc", "axc", "abd", "azc")
tokens filter (x => regex.pattern.matcher(x).matches)
//result: List[String] = List(abc, axc, azc)
編集:
正規表現を前提として、次の例が期待と一致することを確認してください。
val regex = """\b[b-df-hj-np-tv-z]*[aeiou]+[b-df-hj-np-tv-z]*\b""".r
regex.pattern.matcher("good").matches
//res3: Boolean = true
regex.pattern.matcher("no good deed").matches
//res4: Boolean = false
このmatches
メソッドは、文字列全体を照合しようとします。
完全性のための別のオプション:
val words = List("alpha", "bravo", "charlie", "alphie")
words.filter(_.matches("a.*"))
res0: List[java.lang.String] = List(alpha, alphie)
次のように試しましたか?
val list = List("abc","efg","")
val p = java.util.regex.Pattern.compile(".*")
val matching = list filter { p.matcher(_).matches }
Scala の Regex エンジンを使用する際に私が苦労したのは、.matches
考えられるすべての部分文字列を照合するのではなく、文字列全体を照合しようとすることです。
多くの正規表現エンジンでは、次のコードが一致すると評価されます。
"alphie".match(/a/)
Scala では、.matches
here を使用すると失敗します。文字列 "alphie" 全体に対して "a" を照合しようとします。ただし、正規表現が の場合、文字はゼロまたは多数の文字に一致する/a*/
ため、機能します。*
繰り返し正規表現記号を追加できない場合は、次のfindAllIn
方法が役立つ場合があります。
val words = List("alpha", "bravo", "charlie", "alphie")
val regex = "a.".r
//returns a tuple with the list item that matched, plus the text that fit the regex
for {
word <- words
matches <- regex.findAllIn(word)
} yield (word,matches)
注:findAllIn
文字列に複数の一致がある場合、特定の文字列に複数回一致する可能性があります。