次の文字列パターンのIDのリストを抽出したい:{(2)、(4)、(5)、(100)}
注:先頭または末尾のスペースはありません。
リストには最大1000個のIDを含めることができます。
これを行うには、リッチストリングパターンマッチングを使用したいと思います。でも欲求不満で20分やってみました。
誰かが私が正しいパターンを思い付くのを手伝ってもらえますか?とても有難い!
次の文字列パターンのIDのリストを抽出したい:{(2)、(4)、(5)、(100)}
注:先頭または末尾のスペースはありません。
リストには最大1000個のIDを含めることができます。
これを行うには、リッチストリングパターンマッチングを使用したいと思います。でも欲求不満で20分やってみました。
誰かが私が正しいパターンを思い付くのを手伝ってもらえますか?とても有難い!
これがブルートフォース文字列操作です。
scala> "{(2),(4),(5),(100)}".replaceAll("\\(", "").replaceAll("\\)", "").replaceAll("\\{","").replaceAll("\\}","").split(",")
res0: Array[java.lang.String] = Array(2, 4, 5, 100)
コメントに@pstが記載されている正規表現は次のとおりです。括弧が必要ない場合は、正規表現をに変更して"""\d+""".r
ください。
val num = """\(\d+\)""".r
"{(2),(4),(5),(100)}" findAllIn res0
res33: scala.util.matching.Regex.MatchIterator = non-empty iterator
scala> res33.toList
res34: List[String] = List((2), (4), (5), (100))
"{(2),(4),(5),(100)}".split ("[^0-9]").filter(_.length > 0).map (_.toInt)
分割。charは数値の一部ではなく、空でない結果のみを変換します。
ドットまたはマイナス記号を含むように変更される場合があります。
Extractorオブジェクトを使用します。
object MyList {
def apply(l: List[String]): String =
if (l != Nil) "{(" + l.mkString("),(") + ")}"
else "{}"
def unapply(str: String): Some[List[String]] =
Some(
if (str.indexOf("(") > 0)
str.substring(str.indexOf("(") + 1, str.lastIndexOf(")")) split
"\\p{Space}*\\)\\p{Space}*,\\p{Space}*\\(\\p{Space}*" toList
else Nil
)
}
// test
"{(1),(2)}" match { case MyList(l) => l }
// res23: List[String] = List(1, 2)