我很高兴地运行了一个正则表达式replaceAllIn很长一段时间,但当replacement字符串看起来像一个正则表达式的东西时遇到了问题.以下说明了问题(Scala 2.9.1-1).请注意,真正的问题空间要复杂得多,因此使用更简单的解决方案的想法并不是真的可行(只是为了抢占不可避免的"为什么不试试......":D)
val data = "val re = \"\"\"^[^/]*://[^/]*/[^/]*$\"\"\".r"
val source = """here
LATEX_THING{abc}
there"""
val re = "LATEX_THING\\{abc\\}".r
println(re.replaceAllIn(source, data))
Run Code Online (Sandbox Code Playgroud)
这会出现以下错误:
java.lang.IllegalArgumentException: Illegal group reference
Run Code Online (Sandbox Code Playgroud)
如果我data从简单的东西改变为简单的东西:
val data = "This will work"
Run Code Online (Sandbox Code Playgroud)
一切都很好.
它看起来像是replaceAllIn以某种方式查看第二个字符串并将其用作另一个RE来引用从第一个RE记住的内容......但是文档对此没有任何说明.
我错过了什么?
编辑:好的,所以看完java.util.regex.Matcher课后,似乎预期的修复是:
re.replaceAllIn(source, java.util.regex.Matcher.quoteReplacement(data))
Run Code Online (Sandbox Code Playgroud) 我在Vim中编辑了很多Scala代码,这意味着我遇到f =了很多,因为我前往案例陈述(或其他任何)的RHS:
case PatternMatch(a, b, c) => RHS Here
Run Code Online (Sandbox Code Playgroud)
但是Scala支持unicode字符,这意味着许多人会使用?而不是,=>而这会让f ...对手感到痛苦.有没有人知道如果有一种方法可以f =移动到下一个=或?哪个先发生?
val m = Array(10,20,30,30,50,60,70,80) groupBy ( s => s %30 == 0)
m(true).map { kv => println(kv) }
Run Code Online (Sandbox Code Playgroud)
打印值30,30,60
我希望打印索引,即2,3,5.
我该怎么做?
我有一个看似错误的假设.我过去的'主要'语言是C++,在C++中,我可以在伪中执行函数参数绑定:
// declaration
void f(int param1, int param2);
// usage
func<void, int> boundfunc = bind(f, 1, _1)
func(2) // equivalent to f(1, 2)
Run Code Online (Sandbox Code Playgroud)
有趣的是,如果我用函数调用替换1定义boundfunc,那么在绑定站点调用该函数调用,而不是调用func.
因此,当我试图巩固我脑海中的currying概念时,我将其与C++中的绑定进行比较,并且我假设(错误地)使用非''name'参数进行currying将等同于同一个想法 - 在'bind site处调用".当然,这不是正在发生的事情,我很好奇为什么f和g以下表现相同.我显然错过了一些东西......
import scala.util.Random
class X { println("Constructing"); val r = new Random }
def f(limit: Int)(x: X) = x.r.nextInt(limit)
def g(limit: Int)(x: => X) = x.r.nextInt(limit)
def r = f(100)(new X) // Doesn't print "Constructing"
def s = g(100)(new X) // …Run Code Online (Sandbox Code Playgroud)