C 文字列操作 新しいページはコチラ
提供: yonewiki
(→文字列の検索と置換) |
(→文字列の検索と置換) |
||
3,827行: | 3,827行: | ||
UnicodeString input = L"リンゴとミカン/ナシとモモ,ごはんやおかず/おさけもつまみ,programと技術"; | UnicodeString input = L"リンゴとミカン/ナシとモモ,ごはんやおかず/おさけもつまみ,programと技術"; | ||
assert( U_SUCCESS(status) ); | assert( U_SUCCESS(status) ); | ||
− | RegexMatcher* matcher = pattern->matcher(input, status); | + | RegexMatcher* matcher = pattern->matcher(input, status);//入力値での正規表現検索処理をmatcherへ格納 |
+ | |||
+ | |||
printf("★パターンマッチ結果出力\n"); | printf("★パターンマッチ結果出力\n"); | ||
while ( matcher->find() ) { | while ( matcher->find() ) { | ||
3,909行: | 3,911行: | ||
* 部分マッチ"(.)"の置換 | * 部分マッチ"(.)"の置換 | ||
*/ | */ | ||
− | regex = L"(.)[,/とやも]";//正規表現検索文字 | + | regex = L"(.)([,/とやも]|$)";//正規表現検索文字 区切り文字or終端の一文字手前 $1を置換 区切り文字or終端は $2 |
− | + | replacement = L"★";//伏字に置換 | |
+ | result = input; | ||
+ | pattern = RegexPattern::compile(regex, error, status); | ||
matcher = pattern->matcher(input, status); | matcher = pattern->matcher(input, status); | ||
+ | |||
+ | |||
printf("★パターンマッチ結果出力\n"); | printf("★パターンマッチ結果出力\n"); | ||
while ( matcher->find() ) { | while ( matcher->find() ) { | ||
3,931行: | 3,937行: | ||
typedef std::pair<int32_t,int32_t> range_type; | typedef std::pair<int32_t,int32_t> range_type; | ||
std::vector<range_type> matches; | std::vector<range_type> matches; | ||
+ | |||
+ | |||
matcher->reset(); | matcher->reset(); | ||
while ( matcher->find() ) { | while ( matcher->find() ) { | ||
− | // 第一グループを保存する | + | // 第一グループを保存する 条件:$1 が存在して、検索の開始文字位置と終了文字位置が0以上なら保存 |
− | + | if(matcher->groupCount() >= 1 && matcher->start(1,status) > 0 && matcher->end(1,status) > 0 ){ | |
− | + | matches.push_back(range_type(matcher->start(1,status), matcher->end(1,status))); | |
assert( U_SUCCESS(status) ); | assert( U_SUCCESS(status) ); | ||
+ | } | ||
} | } | ||
− | |||
− | |||
// 末尾から置換 | // 末尾から置換 | ||
while ( !matches.empty() ) { | while ( !matches.empty() ) { | ||
range_type range = matches.back(); | range_type range = matches.back(); | ||
matches.pop_back(); | matches.pop_back(); | ||
− | result.replace(range.first, range.second - range.first, | + | result.replace(range.first, range.second - range.first, replacement); |
− | + | ||
} | } | ||
printf("★部分一致パターンの置換結果出力\n"); | printf("★部分一致パターンの置換結果出力\n"); | ||
4,014行: | 4,020行: | ||
[2,4]ゴと | [2,4]ゴと | ||
[2,3]ゴ | [2,3]ゴ | ||
+ | [3,4]と | ||
[6,8]ン/ | [6,8]ン/ | ||
[6,7]ン | [6,7]ン | ||
+ | [7,8]/ | ||
[9,11]シと | [9,11]シと | ||
[9,10]シ | [9,10]シ | ||
+ | [10,11]と | ||
[12,14]モ, | [12,14]モ, | ||
[12,13]モ | [12,13]モ | ||
+ | [13,14], | ||
[16,18]んや | [16,18]んや | ||
[16,17]ん | [16,17]ん | ||
+ | [17,18]や | ||
[20,22]ず/ | [20,22]ず/ | ||
[20,21]ず | [20,21]ず | ||
+ | [21,22]/ | ||
[24,26]けも | [24,26]けも | ||
[24,25]け | [24,25]け | ||
+ | [25,26]も | ||
[28,30]み, | [28,30]み, | ||
[28,29]み | [28,29]み | ||
+ | [29,30], | ||
[36,38]mと | [36,38]mと | ||
[36,37]m | [36,37]m | ||
+ | [37,38]と | ||
+ | |||
+ | [39,40]術 | ||
+ | [39,40]術 | ||
+ | [40,40] | ||
− | リン★とミカ★/ナ★とモ★,ごは★やおか★/おさ★もつま★, | + | ★部分一致パターンの置換結果出力 |
+ | リン★とミカ★/ナ★とモ★,ごは★やおか★/おさ★もつま★,progra★と技★ | ||
</syntaxhighlight> | </syntaxhighlight> | ||
149行目以降に記述した部分一致からのプログラムはやや複雑な表記になっていますが、これはICUに準備された関数だけでは部分一致の処理ができないために自分で工夫をしなければならないことに起因しています。 | 149行目以降に記述した部分一致からのプログラムはやや複雑な表記になっていますが、これはICUに準備された関数だけでは部分一致の処理ができないために自分で工夫をしなければならないことに起因しています。 |