我想在以下内容中提取字符串模式的ID列表: {(2),(4),(5),(100)}
注意:没有前导或尾随空格。
列表最多可包含1000个ID。
我想使用丰富的字符串模式匹配来执行此操作。但我沮丧地试了20分钟。
有人能帮我提出正确的模式吗?非常感谢!
答案 0 :(得分:4)
这是强力字符串操作。
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))
答案 1 :(得分:2)
"{(2),(4),(5),(100)}".split ("[^0-9]").filter(_.length > 0).map (_.toInt)
拆分,其中char不是数字的一部分,只转换非空结果。
可能会被修改为包含点或减号。
答案 2 :(得分:0)
使用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)