String 在满足条件的特定字符处拆分字符串

String 在满足条件的特定字符处拆分字符串,string,scala,split,String,Scala,Split,我把一个向量写进了一个文本文件..就像 向量((a1,b1,c1),(a2,b2,c2),…) 这是一个长字符串,我可以从文本文件中读取它,并将其存储在字符串变量(例如v)中。我想将字符串“v”拆分为一个数组,而不是逗号,而是在逗号处,仅分隔元组,即在每个元组的右括号之后。 在Scala中如何做到这一点?(假设每个元组的中间元素不再是元组,并且在开始和结束处不包含任何括号。)使用regex检测元组(假设元组中没有括号)并远离数组,但使用类似列表的方法: 产生: (a1,b1,c1) (a2,b

我把一个向量写进了一个文本文件..就像 向量((a1,b1,c1),(a2,b2,c2),…) 这是一个长字符串,我可以从文本文件中读取它,并将其存储在字符串变量(例如v)中。我想将字符串“v”拆分为一个数组,而不是逗号,而是在逗号处,仅分隔元组,即在每个元组的右括号之后。
在Scala中如何做到这一点?(假设每个元组的中间元素不再是元组,并且在开始和结束处不包含任何括号。)

使用regex检测元组(假设元组中没有括号)并远离数组,但使用类似列表的方法:

产生:

(a1,b1,c1)
(a2,b2,c2)
(a3,b3,c3)
res: List[(Any, Any, Any)] = List((a1,(aa1,(aaa1,bbb1,ccc1),cc1),c1), (a2,b2,c2), (a3,b3,c3))

我还没有对其进行全面测试,但应该可以:

v.split(",?(?=\\([\\w,]*\\))")
它可能也会得到一些空白条目,并且
向量(
仍将存在,如果发生这种情况,您需要执行以下操作:

val v = """Vector((a1,b1,c1),(a2,b2,c2),(a3,b3,c3))"""

v.replaceAll("Vector\\((.*)\\)", "$1")
  .split(",?(?=\\([\\w,]*\\))")
  .filter(_.trim != "")
它有点凌乱,可能可以清理,但应该能用。就正则表达式的工作方式而言:

  • ,?
    -可选逗号(可选表示为
  • (?=…)
    -正向前瞻
  • \\(…..\)
    -转义括号(括号是正则表达式特殊字符)
  • [\\w,]*
    -任意单词字符或逗号,任意次数
注意:如果要使用
split
,则使用此解决方案。我建议使用Scala正则表达式库,因为它会更整洁一些(尽管我不确定每个方法的性能影响)


还要注意:在普通正则表达式中,转义字符只需要一个反斜杠,而Scala需要两个。

您可以尝试编写自己的解析器。以下是一个例子:

import scala.util.parsing.combinator.RegexParsers

class Parser extends RegexParsers {

  def id = "[a-z0-9]+".r

  def value: Parser[Any] = id | tuple

  def tuple = "(" ~ rep1sep(value, ",") ~ ")" ^^ {
    case _ ~ List(v1, v2, v3) ~ _ => (v1, v2, v3)
  }

  def tuples = rep1sep(tuple, ",")

  def vector = "Vector(" ~ tuples ~ ")" ^^ {
    case _ ~ tuples ~ _ => tuples
  }
}

val string = "Vector((a1,(aa1, (aaa1, bbb1, ccc1), cc1),c1),(a2,b2,c2),(a3,b3,c3))"
val parser = new Parser
val result = parser.parseAll(parser.vector, string)
val res = result.get
产生:

(a1,b1,c1)
(a2,b2,c2)
(a3,b3,c3)
res: List[(Any, Any, Any)] = List((a1,(aa1,(aaa1,bbb1,ccc1),cc1),c1), (a2,b2,c2), (a3,b3,c3))

“向量((a1,b1,c1),(a2,b2,c2),……”。拆分(“),(”)
?我选中了。它不起作用。我只想在每个元组的右括号后的逗号处拆分。我应该为每个元组保留右括号和左括号。只需要在括号之间的逗号处拆分。括号应保留在结果数组的元组状字符串中。尝试使用
split((?元组可能包含另一个元组作为其组件之一。假设c1是元组中的另一个元组(a1、b1、c1)。这是可能的。因此括号在某些情况下是不可否认的。@raghhuramm如果一个元组可以是另一个元组的一部分,您如何设想事实上的元组树(而不是一个元组列表)的“扁平化”呢?您是否允许一些引用,即
(a1,b1,$c1),其中$c1=(a15,b15,c15)
?好的。我意识到这可能有点复杂。因为在一个元组内部也可能发生“,”(“问题。假设我想分离最外层的元组,就像字符串一样,只填充到分割的数组中。那么dyrkin的答案就是这个。