Regex Scala:正则表达式模式是否与大括号匹配?

Regex Scala:正则表达式模式是否与大括号匹配?,regex,scala,parsing,curly-braces,wml,Regex,Scala,Parsing,Curly Braces,Wml,因此,我正在为我的作业创建一种类似WML的语言,作为第一步,我应该创建正则表达式来识别以下内容: //single = "{" //double = "{{" //triple = "{{{" 下面是我的第二个代码: val double = "\\{\\{\\b".r 我的测试是: println(double.findAllIn("{{ s{{ { {{{ {{ {{x").toArray.mkString(" ")) 比特,它什么都不打印!它应该打印第一个、第二个、第五个和第六个令牌

因此,我正在为我的作业创建一种类似WML的语言,作为第一步,我应该创建正则表达式来识别以下内容:

//single = "{"
//double = "{{"
//triple = "{{{"
下面是我的第二个代码:

val double = "\\{\\{\\b".r
我的测试是:

println(double.findAllIn("{{ s{{ { {{{ {{ {{x").toArray.mkString(" "))
比特,它什么都不打印!它应该打印第一个、第二个、第五个和第六个令牌。我尝试了\b和\b的每一个组合,甚至用\{2,2}代替\{{{{但仍然不起作用。有什么帮助吗

作为一个附带问题,如果我想让它只匹配第一个和第五个标记,我需要做什么?

我测试了您的代码(Scala 2.12.2 REPL),与您的“it't not print any”语句相反,它实际上是从“{x”子字符串打印“{{{”事件

这是因为
x
是一个单词字符,
\b
匹配第二个
{
x
之间的位置

依照

它在一个称为“字边界”的位置匹配。这个匹配是零长度的

有三种不同的位置可以作为单词边界:

1) 如果字符串中的第一个字符是 字字符

至于解决方案,这取决于精确的定义,但环顾四周似乎对我有效:

"(?<!\\{)\\{{2}(?!\\{)".r

你可以阅读关于lookarounds的内容。基本上,它们匹配符号或表达式作为边界;简单地说,它们匹配内容,但不包括在匹配字符串本身中

环顾四周的一些例子

  • (?z
  • aaa(?=z)
    匹配“aaa”,后跟
    z
  • aaa(?!z)
    匹配“aaa”而不是后跟
    z

另外,为了让您的生活更轻松,Scala提供了逃逸的
”,因此我们可以说:

"(?<!\\S)\\{\\{(?!\\S)".r

”(?谢谢!还没有测试过它,但想解释一下括号中的每一块符号的实际作用吗?@user7552492这些是lookarounds,我在答案中添加了解释。基本上它们有点像匹配组(比如
“ab(za)k”。r
匹配“abzak”,但你可以将“za”提取为
匹配。组(1)
),但不需要以编程方式提取值。
"(?<!\\S)\\{\\{(?!\\S)".r
"(?<=^|\\s)\\{\\{(?=\\s|$)".r
"(?<!\\S)\\{\\{(?!\\S)".r
"""(?<!\S)\{\{(?!\S)""".r