次の構造の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の単語は変更されません(小文字のままです)。
私は何か間違ったことをしていましたか?
感謝の気持ちを助けてください-ありがとう。
(?:<name>|\G)\K\b(\w)(\w+\s*)
\u$1$2
説明:
(?:<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>
スクリーンキャプチャ:
これを試して:
Find what: ([>\s])([a-z])
Replace with: \1\u\2
前の文字がスペース文字または>
の場合、これにより小文字が大文字に変更されます。
編集:@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>
_
1つのノードに含まれる単語の数がわからない場合は、代わりにXMLパーサーを使用する必要があります。