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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

5回答

2609閲覧

文字入力のカウントを半角は2文字で1文字とし、全角は1文字で1字といった処理

chiruchiru

総合スコア6

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2019/07/24 12:10

初質問失礼します。

文字入力のカウントを半角は2文字で1文字とし、全角は1文字で1字といった処理をしたいです。
正規表現が苦手でなかなか思うように行きません、ご教示いただけないでしょうか?
半角文字は先出しカウント表示(例)「1」→1文字、「11」→1文字

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/07/24 12:14

なかなか思うように行かないコードはどこでしょう? どこまでやってどんな状況かを書かないと、やってほしいだけの丸投げとみなされ回答が付きません。
y_waiwai

2019/07/24 12:21

半角文字とは? この定義をしっかりしてもらわないとどーにもならないような
m.ts10806

2019/07/24 13:35

この内容だとJavaScriptかどうかすらも判断つきませんね
think49

2019/07/24 23:38

"半角は2文字で1文字とし、全角は1文字で1字" 半角/全角が混在していたら、どうカウントしますか。例えば、"abあいう" は「2文字/3字」と表現するのですか。
think49

2019/07/24 23:42

"(例)「1」→1文字、「11」→1文字" 「半角一文字 = 1文字」「半角二文字 = 1文字」とカウントされていますが、後者は要件通りなら、「2文字」なのでは?
Lhankor_Mhy

2019/07/25 00:37

think49さん、質問文には「半角は2文字で1文字」とありませんか?
think49

2019/07/25 03:53

Lhankor_Mhy さん ああ、なるほど。要件を理解しました。 ただ、その理屈ですと、例の "「1」→1文字" は半角文字なので、0.5文字になると思うのですが…。
Lhankor_Mhy

2019/07/25 04:00

> 0.5文字になる そうなんですよね……
guest

回答5

0

正規表現は要りません。String.charCodeAt で文字コードが得られるので、それが 255 以下なら半角です。文字列を構成するすべての文字についてループで調べていけばいいと思います。

追記

半角カナを半角と定義するなら FF61 から FF9F も半角になります。

投稿2019/07/24 12:25

編集2019/07/24 12:28
Zuishin

総合スコア28660

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

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

ikadzuchi

2019/07/25 01:22

255では判断できません。 伝統的に全角扱いの「✕」「¶」あたりが入ってしまいますし、アクセント付きアルファベットの一部のみ入り一貫性が無いです。
guest

0

encodeURIComponent

  • 半角 … size=1
  • 全角 … size=2, 2byte以上(UTF-8基準)

JavaScript

1let size = 0; 2for (let char of string) size += 1 + encodeURIComponent(char).length > 3; 3 4console.log(size);

String.prototype.replace()

正規表現で全角文字を2文字に置換する方法。
(サロゲートペアはしっかり調べてないので、別途問題がないか確認下さい)

JavaScript

1strimg.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[\s\S]/g, char => encodeURIComponent(char).length > 3 ? 'ZZ', char).length

実装が対応しているなら、su フラグを使うことで正規表現パターンをシンプルに出来ます?
https://jsprimer.net/basic/string-unicode/
http://js-next.hatenablog.com/entry/2018/09/08/225552

JavaScript

1strimg.replace(/./gsu, char => encodeURIComponent(char).length > 3 ? 'ZZ', char).length

ただし、これらは正規表現を利用する為に、無理やりダミー文字列を生成しているコードであり、洗練されたコードではないと私は思います。

正規表現は、検索置換を行うための文法であり、文字列をカウントする機能はありません。

Re: chiruchiru さん

投稿2019/07/24 23:55

編集2019/07/25 03:49
think49

総合スコア18162

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

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

0

参考情報

  • [JavaScript] 半角は1文字、全角は2文字として文字数をカウントする

https://javascript.programmer-reference.com/javascript-han1zen2/

javascript 文字 幅
で google 検索すると、ブラウザ上での表示幅を計算する方法などについてもいろいろな情報を得ることができます。

投稿2019/07/24 22:08

katoy

総合スコア22324

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

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

0

以前、excelのLEFTBをJavaScriptで再現しようとしたことがありましたので、それを提示しますね。

js

1 var leftb = (text, num=1, i=0) => Array.from(text).filter(s =>{ 2 i += encodeURIComponent(s).replace(/%../g,"x").length > 1 ? 2 : 1; 3 if ( (/[ヲ-゚・]/).test(s) ) i--; 4 return i<=num; 5 }).join('');

このコード中の変数iがその時点での「文字数」の2倍です。
ただ、半角カナ等のマルチバイト扱いの半角文字はリストするしかないと思います。自己使用のためにアドホックに追加しているだけなので、おそらくこれでは不足しているかと思いますので、そこは調べてください。


参考にした記事を見つけたので、提示して追記します。
JavaScript文字列のバイト数を数える - encodeURIComponent版 - Qiita

投稿2019/07/25 00:46

編集2019/07/25 00:58
Lhankor_Mhy

総合スコア36104

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

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

0

先日も正規表現で全半角を分けた数え方の質問がありましたが、まともな正規表現では不可能です。
正規表現以外の方法を使ってください。
https://teratail.com/questions/198252

投稿2019/07/25 00:43

ikadzuchi

総合スコア3047

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問