我有一个具有以下结构的 XML 文件:
<id>1</id>
<name>alligator and stingray</name>
...
<id>99999</id>
<name>dolphin with carp</name>
我需要结果:
<id>1</id>
<name>Alligator And Stingray</name>
...
<id>99999</id>
<name>Dolphin With Carp</name>
我使用了这个正则表达式:
Search: (<name>)(.*)(</name>)
Replace: \1\u\2\3
我得到的结果:
<id>1</id>
<name>Alligator and stingray</name>
...
<id>99999</id>
<name>dolphin with carp</name>
它只对第一个ID的第一个单词进行大写,其余单词和其他ID上的单词保持不变(仍然是小写)!
我是不是做错什么了?
感谢您的帮助-谢谢。
答案1
- Ctrl+H
- 找什么:
(?:<name>|\G)\K\b(\w)(\w+\s*)
- 用。。。来代替:
\u$1$2
- 检查匹配大小写
- 检查环绕
- 检查正则表达式
- Replace all
解释:
(?:<name>|\G) # non capture group, "<name>" or restart from previous match position
\K # forget all we have seen until this position
\b # word boundary
(\w) # group 1, 1 word character
(\w+\s*) # group 2, 1 or more word characters followed by optional space
替代品:
\u$1 # uppercase content of group 1 (i.e. the first letter)
$2 # content of group 2 (i.e. the rest of the word)
给定示例的结果:
<id>1</id>
<name>Alligator And Stingray</name>
...
<id>99999</id>
<name>Dolphin With Carp</name>
屏幕截图:
答案2
尝试这个:
Find what: ([>\s])([a-z])
Replace with: \1\u\2
>
如果前一个字符是空格字符或,则将小写字符更改为大写。
答案3
编辑:使用@Toto 的答案。这个答案不使用非常规语言特性,因此永远无法完全回答问题,尽管它确实解决了有限长度的情况(现在)。
只有当一个块中的单词数达到最大限度时,您尝试执行的操作才有可能<name>...</name>
。
您当前正则表达式的问题在于,组 \2 适用于示例中标签 () 内的整个文本alligator and stingray
,而 \u 仅对紧随其后的字符起作用。
如果节点中的单词数有上限,则可以使用类似于以下的正则表达式:
查找内容:<name>(\w)(\w* ?)(\w?)(\w*? ?)(\w?)(\w*? ?)</name>
替换为:<name>\U\1\E\2\U\3\E\4\U\5\E\6</name>
如果您不知道一个节点中有多少个单词,那么您应该使用 XML 解析器。