2012-11-27 34 views
0

我奋力来连接两个文本消息到Scala中使用正则表达式一个单一的文本字符串Scala的正则表达式用双引号

original message = "part1 "+" part2" 
original message = "part1 " + " part2" 
original message = "part 1 "+ " part2" 

concatenated message = "part1 part2" 

我现在用的就是以下(此代码来替换至少应+标志与空)

val line:String = """"text1"+"text2"""" //My original String which is "text1"+"text2" 
val temp_line:String = line.replaceAll("\\+","") 
println(temp_line) 

它工作正常,结果“text1”“text2”。有没有办法使用正则表达式得到输出“text1 text2”?

请帮忙。在此先感谢

+10

这真的不清楚。信息中是否有引号和加号?连接的消息是你想要产生的,而不管其他空间和东西(和引号)在其他?你想让它工作到两个,还是应该用一个或三个做一些明智的事情?你是否需要完全匹配单词'part',或者你是在说明两者的文本必须匹配,还是可以是任意文本? –

+0

是的。原始邮件中有加号和引号。所需的结果将是用引号括起来的单个文本,这将引发原始消息中所有文本的内容。我希望正则表达式也可以为一个或三个工作。 Part1和Part2是可以是任意文本的示例文本。感谢您看到这个 – yalkris

+0

你的问题让我感到困惑,因为这与正则表达式没有任何关系...... – Dylan

回答

1

这实在不是对正则表达式的理想的问题,但是没关系:

val Part = """"([^"]*)"(.*$)""".r // Quotes, non quotes, quotes, then the rest 
val Plus = """\s*\+\s*(.*)""".r  // Plus with optional spaces, then the rest 

def parts(s: String, found: List[String] = Nil): String = s match { 
    case Part(p,rest) => rest match { 
    case "" => (p :: found).map(_.filter(c => !c.isWhitespace)).reverse.mkString(" ") 
    case Plus(more) => parts(more, p :: found) 
    case x => throw new IllegalArgumentException(s"$p :$x:") 
    } 
    case x => throw new IllegalArgumentException(s"|$x|") 
} 

这只是一块需要输入字符串开片;如果你想看看它是如何工作的,你可以添加printlns。 (请注意,+是正则表达式中的一个特殊字符,因此您需要将其转义以匹配它。)

scala> parts(""""part1 "+" part2"""") 
res1: String = part1 part2 

scala> parts(""""part1 " + " part2"""") 
res2: String = part1 part2 

scala> parts(""""part 1 "+ " part2"""") 
res3: String = part1 part2 
+0

虽然这有点复杂,但工作。我研究了一个使用split和replaceAll的解决方案,它更易于阅读和编辑。尽管如此,您的解决方案对于我的问题是理想的。谢谢。 – yalkris