有选择地大写字符串
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))
}
这里最主要的是提取正确的捕获组。
还需要感谢这里的答案,以便在 scala 中获取捕获组:Scala capture group using regex
我有一个字符串,里面有一些 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))
}
这里最主要的是提取正确的捕获组。
还需要感谢这里的答案,以便在 scala 中获取捕获组:Scala capture group using regex