如何仅在 scala 中小写捕获组

Sta*_*lav 3 regex scala replaceall

这段代码:

\n\n
"""{"nAMe": "Deloise", "WINS": [["three of a kind", "5\xe2\x99\xa3"]]}""".replaceAll("""(\\"[^"]+\\" *:)""", "|UPERCASETEST|$1|".toLowerCase())\n
Run Code Online (Sandbox Code Playgroud)\n\n

生产:

\n\n
String = {|upercasetest|"nAMe":| "Deloise", |upercasetest|"WINS":| [["three of a kind", "5\xe2\x99\xa3"]]}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我期待的时候:

\n\n
String = {|upercasetest|"name":| "Deloise", |upercasetest|"wins":| [["three of a kind", "5\xe2\x99\xa3"]]}\n
Run Code Online (Sandbox Code Playgroud)\n\n

知道为什么捕获组不希望小写以及如何解决它吗?

\n

Wik*_*żew 5

您需要将匹配对象传递给replaceAllIn您可以在其中操作内容的 lambda 表达式,否则,在 内部replaceAll$1不会“扩展”为实际的第 1 组子匹配值:

\n\n
val s = """{"nAMe": "Deloise", "WINS": [["three of a kind", "5\xe2\x99\xa3"]]}"""\nval rx = """(\\"[^"]+\\" *:)""".r\nval replacedStr = rx replaceAllIn (s, m => s"|UPERCASETEST|${m.group(1)}|".toLowerCase())\nprintln(replacedStr)\n
Run Code Online (Sandbox Code Playgroud)\n\n

查看Scala 演示

\n\n

输出:

\n\n
{|upercasetest|"name":| "Deloise", |upercasetest|"wins":| [["three of a kind", "5\xe2\x99\xa3"]]}\n
Run Code Online (Sandbox Code Playgroud)\n