6

文字列のリストと正規表現パターンがあります。リストから正規表現に一致しないアイテムをフィルタリングしたいと思います。動作していないように見える次のコードを使用しています。

val matching = token.filter(x => regex.pattern.matcher(x).matches)

トークンは文字列のリストで、正規表現は一致させたいパターンです

4

4 に答える 4

10

コードは機能するはずです。正規表現が正しいことを確認しますか?

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メソッドは、文字列全体を照合しようとします。

于 2013-02-08T06:17:42.557 に答える
3

完全性のための別のオプション:

val words = List("alpha", "bravo", "charlie", "alphie")
words.filter(_.matches("a.*"))

res0: List[java.lang.String] = List(alpha, alphie)
于 2013-02-08T06:18:56.500 に答える
1

次のように試しましたか?

val list = List("abc","efg","")
val p = java.util.regex.Pattern.compile(".*")

val matching = list filter { p.matcher(_).matches }
于 2013-02-08T06:18:02.927 に答える
1

Scala の Regex エンジンを使用する際に私が苦労したのは、.matches考えられるすべての部分文字列を照合するのではなく、文字列全体を照合しようとすることです。

多くの正規表現エンジンでは、次のコードが一致すると評価されます。

"alphie".match(/a/)

Scala では、.matcheshere を使用すると失敗します。文字列 "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文字列に複数の一致がある場合、特定の文字列に複数回一致する可能性があります。

于 2013-02-08T06:43:02.847 に答える