有选择地大写字符串

Selectively uppercasing a string

我有一个字符串,里面有一些 XML 标签,比如:

"hello <b>world</b> and <i>everyone</i>"

有没有好的 Scala/functional 方式将单词大写,而不是标签大写,使其看起来像:

"HELLO <b>WORLD<b> AND <i>EVERYONE</i>"

我们可以使用 dustmouse 的正则表达式将所有文本 in/outside XML 标记替换为 Regex.replaceAllIn. We can get the matched text with Regex.Match.matched 然后可以很容易地大写使用 toUpperCase.

val xmlText = """(?<!<|<\/)\b\w+(?!>)""".r

val string = "hello <b>world</b> and <i>everyone</i>"
xmlText.replaceAllIn(string, _.matched.toUpperCase)
// String = HELLO <b>WORLD</b> AND <i>EVERYONE</i>

val string2 = "<h1>>hello</h1> <span>world</span> and <span><i>everyone</i>"
xmlText.replaceAllIn(string2, _.matched.toUpperCase)
// String = <h1>>HELLO</h1> <span>WORLD</span> AND <span><i>EVERYONE</i>

使用 dustmouse 更新的正则表达式:

val xmlText = """(?:<[^<>]+>\s*)(\w+)""".r

val string3 = """<h1>>hello</h1> <span id="test">world</span>"""
xmlText.replaceAllIn(string3, m => 
  m.group(0).dropRight(m.group(1).length) + m.group(1).toUpperCase)
// String = <h1>>hello</h1> <span id="test">WORLD</span>

好的,这个怎么样。它只是打印结果,并考虑了其他人提出的一些场景。不知道如何在不从彼得的回答中无情地偷猎的情况下利用输出:

val string = "<h1 id=\"test\">hello</h1> <span>world</span> and <span><i>everyone</i></span>"
val pattern = """(?:<[^<>]+>\s*)(\w+)""".r

pattern.findAllIn(string).matchData foreach {
    m => println(m.group(1))
}

这里最主要的是提取正确的捕获组。

工作示例:http://ideone.com/2qlwoP

还需要感谢这里的答案,以便在 scala 中获取捕获组:Scala capture group using regex