※質問は問題の解法を知りたいという趣旨ではありません。
###概要
問題:No.341 沈黙の期間
初めての方はC/C++(UTF-8が扱いづらい言語)で解くことはおすすめしません。
入力
S
として(BOMなし、改行以外の印字可能な)UTF-8文字列が与えられます。
UTF-8文字列の長さは1文字以上100文字以下です。
上記問題を解こうとしたのですが自力では無理でした。
注意書きにもあるように初心者には難易度が高すぎました。
解説を読んでもなんのことかさっぱり分かりません。
提出済みコードをいくつか読む中で1番分かりやすかったものがこちらです。
std::string.find()
で検索文字を1文字づつ大きくして最大値を得るというものでなるほどと思いました。
そこで正規表現でも似たようなことが出来るはずだと思ったので試してみることにしました。
###質問
下記コードで正規表現を使った文字列の検索をしてその最大文字列長を得たいのですが、
半角文字のみの場合は期待通りの結果が得られているのですが、
全角文字を検索させると期待通りの結果が得られないのは何故でしょうか?
C++で全角文字を扱うのがほぼ初めてで基本的なことを見落としているかも知れません。
ヒントやアドバイスなどご教示して頂けると助かります。
よろしくお願いします。
###試したこと
参考:正規表現チェッカー
上記サイトにて正規表現の検索テストをしてみたところ問題なくヒットしていました。
C++
1#include <bits/stdc++.h> 2using namespace std; 3 4int maxsize_pattern(const string s, const string pattern) { 5 int res = 0; 6 regex pt(pattern); 7 sregex_iterator end, it{s.begin(), s.end(), pt}; 8 for (; it != end; ++it) { res = max(res, int(it->length())); } 9 return res; 10} 11 12void test() { 13 string s1 = "日本語※あ※※※※※い※※※う"; 14 string r1 = "(※+)"; 15 cout << maxsize_pattern(s1, r1) << endl; 16 17 string s2 = "aa0a00000a00"; 18 string r2 = "(0+)"; 19 cout << maxsize_pattern(s2, r2) << endl; 20} 21 22int main() { 23 ios::sync_with_stdio(false); 24 cin.tie(0); 25 test(); 26}
OUTPUT
13 //5が期待する結果※※※※※5個を検出して欲しい 25
開発環境
Win10 x64(10.0.18362)
VSC1.49.0
C++17
gcc version 10.2.0 (Rev1, Built by MSYS2 project)
回答1件
あなたの回答
tips
プレビュー