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

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

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

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

4回答

162閲覧

数字が含まれた文字列から「数字の前」「数字」「数字の後」を取り出したい

parapa

総合スコア17

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

1クリップ

投稿2018/10/05 08:22

あなたは30日間ログインしていません

これを「あなたは」「30」「日間ログインしていません」に分割したいです。
数字は可変です。

詳細

実際の実装では数値だけに下線やリンクをつけたいです。
propsで渡された文字列の中に数値が存在している場合のみ分割して、独自のタグを付与する予定です。

目指したいコード

JavaScript

1const message = 'あなたは30日間ログインしていません'; 2const divide = message.関数 3 4<div>{divide[0]}<span>{divide[1]}</span>{divide[3]}</div>

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

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

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

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

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

guest

回答4

0

分けたいのが「数字以外で構成された部分」「数字のみで構成された部分」「数字以外で構成された部分」
ということであれば、正規表現で

([^0-9]*)([0-9]+)([^0-9]*)

に合致する文字列と言うことになるでしょうから、
あとは JavaScript の RegExp を使って処理しましょう。
※match の結果がnullになるのであれば、それは「数字の部分がない文字列」であることを示すので、いかようにでも対応できるはずです

投稿2018/10/05 08:31

tacsheaven

総合スコア13703

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

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

0

ベストアンサー

要件定義をしっかり行ってから作ります。

  • 数字が複数ある場合
  • 数字で始まる場合
  • 数字が存在しない場合

JavaScript

1'use strcit'; 2console.log('あなたは30日間ログインしていません'.match(/\d+|\D+/g)); // ["あなたは", "30", "日間ログインしていません"] 3console.log('最終ログイン日時は2018年7月25日です'.match(/\d+|\D+/g)); // ["最終ログイン日時は", "2018", "年", "7", "月", "25", "日です"] 4console.log('2018年7月25日'.match(/\d+|\D+/g)); // ["2018", "年", "7", "月", "25", "日"] 5console.log('今回が初めてのログインです'.match(/\d+|\D+/g)); // ["今回が初めてのログインです"] 6 7console.log('あなたは30日間ログインしていません'.split(/(\d+)/)); // ["あなたは", "30", "日間ログインしていません"] 8console.log('最終ログイン日時は2018年7月25日です'.split(/(\d+)/)); // ["最終ログイン日時は", "2018", "年", "7", "月", "25", "日です"] 9console.log('2018年7月25日'.split(/(\d+)/)); // ["2018", "年", "7", "月", "25", "日"] 10console.log('今回が初めてのログインです'.split(/(\d+)/)); // ["今回が初めてのログインです"]

Re: parapa さん

投稿2018/10/05 12:17

think49

総合スコア18164

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

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

katoy

2018/10/06 09:49

エース網羅としては 少なくも 9 ケースあると思います。 s: String, d: 数字列 として列挙します。 1. s d s 2. s d 3. d s 4. d 5. s 6. s d s d 7. d s d 8. s d s d s 9. 空文字
think49

2018/10/07 07:48 編集

あげて頂いたケースの中では、空文字が考慮に入っていませんでした。 "".match(/\d+|\D+/g); // null "".split(/(\d+)/); // [""] 後続処理次第ですが、当初の目的「数値が存在している場合のみ分割して、独自のタグを付与する予定」を振り返ってみると、string.replace(/\d+/g, () => {}) や createDocumentFragment 採用に方針転換しそうです。
guest

0

数字が1箇所にしかでてこないならこれで

javascript

1const message = 'あなたは30日間ログインしていません'; 2const matches=message.match(/(^.+?)(\d+)(.+$)/); 3console.log(matches[1]); 4console.log(matches[2]); 5console.log(matches[3]); 6

投稿2018/10/05 09:30

yambejp

総合スコア114843

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

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

0

... 数値が存在している場合のみ分割して、独自のタグを付与する予定です。 ...

それがゴールなら、文字列を分割するしなくでもできるとおもいます。

正規表現で 数字文字列をみつけて、それを
<span class=number>数字文字列</span>
などに文字列置換すれば良いです。

参考情報

  • JavaScriptの正規表現 各メソッド

https://qiita.com/mokoaki/items/4740c9bd921d2b8d3d82

投稿2018/10/06 09:04

katoy

総合スコア22324

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

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

parapa

2018/10/06 09:12 編集

なるほど! html(message.match(/\d+|\D+/g)) といった感じでしょうか? 試してみます
katoy

2018/10/06 09:57 編集

数字 の定義もはっきりさせておくとよいです。 -1 や +1 といった符号付き数字はどうするか? 1.23のような小数はどうあつかうか? 0xFFF や 0x123 のような10進以外の表記はどう扱うか? 1,234 のような 3 桁区切り表記の数字はどうあつかうか? (入力とてありえないから処理は考慮しないのか、これらも処理できるようにするのか)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問