質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

4322閲覧

C++ 正規表現 全角だと期待した結果が得られないのは何故?

mjk

総合スコア303

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/09/18 21:39

編集2020/09/18 21:54

※質問は問題の解法を知りたいという趣旨ではありません。

###概要
問題:No.341 沈黙の期間

初めての方はC/C++(UTF-8が扱いづらい言語)で解くことはおすすめしません。
入力
S
として(BOMなし、改行以外の印字可能な)UTF-8文字列が与えられます。
UTF-8文字列の長さは1文字以上100文字以下です。

上記問題を解こうとしたのですが自力では無理でした。
注意書きにもあるように初心者には難易度が高すぎました。
解説を読んでもなんのことかさっぱり分かりません。
提出済みコードをいくつか読む中で1番分かりやすかったものがこちらです。
std::string.find()で検索文字を1文字づつ大きくして最大値を得るというものでなるほどと思いました。

そこで正規表現でも似たようなことが出来るはずだと思ったので試してみることにしました。

###質問
下記コードで正規表現を使った文字列の検索をしてその最大文字列長を得たいのですが、
半角文字のみの場合は期待通りの結果が得られているのですが、
全角文字を検索させると期待通りの結果が得られないのは何故でしょうか?
C++で全角文字を扱うのがほぼ初めてで基本的なことを見落としているかも知れません。
ヒントやアドバイスなどご教示して頂けると助かります。
よろしくお願いします。

###試したこと
イメージ説明
参考:正規表現チェッカー
上記サイトにて正規表現の検索テストをしてみたところ問題なくヒットしていました。

参考:std::regex_search


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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2020/09/18 22:16

シングルバイト圏のソフトウェアがマルチバイト圏で何のトラブルもなく使える考えるのは、知らぬが仏
mjk

2020/09/19 01:38

競プロ系の問題解くだけなら全角使うことないかなと思ってたら全角問題があって面食らいました。 C++で全角がこんなにも扱いづらいと思いませんでした。 実務が全角だらけの世界だと想像すると全角エンジニアの方々の苦労は並大抵のことでは無いのでしょうね。
guest

回答1

0

ベストアンサー

全角文字に対応したいなら wstring, wregex ... 使わにゃならんでしょうねぇ。

C++

1#include <iostream> 2#include <regex> 3 4using namespace std; 5 6int maxsize_pattern(const wstring s, const wstring pattern) { 7 int res = 0; 8 wregex pt(pattern); 9 wsregex_iterator end, it{s.begin(), s.end(), pt}; 10 for (; it != end; ++it) { res = max(res, int(it->length())); } 11 return res; 12} 13 14void test() { 15 wstring s1 = L"日本語※あ※※※※※い※※※う"; 16 wstring r1 = L"(※+)"; 17 cout << maxsize_pattern(s1, r1) << endl; 18 19 wstring s2 = L"aa0a00000a00"; 20 wstring r2 = L"(0+)"; 21 cout << maxsize_pattern(s2, r2) << endl; 22} 23 24int main() { 25 ios::sync_with_stdio(false); 26 cin.tie(0); 27 test(); 28}

投稿2020/09/18 22:02

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mjk

2020/09/18 22:12

回答ありがとうございます。wregexなる存在を知りませんでした。早速検証してみます。 ちょっと時間掛かると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問