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

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

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

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

Q&A

解決済

7回答

9546閲覧

正規表現で0の連続以外にマッチさせたい。

akitomo

総合スコア23

正規表現

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

1グッド

1クリップ

投稿2019/06/12 01:29

正規表現で0の連続以外にマッチさせたいです。

例えば、
「0」「00」「000000000」
等、全てが0の連続の場合はアンマッチ

それ意外であればマッチするような正規表現が理想です。

どうぞよろしくお願いいたします。

s_tatsuki👍を押しています

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

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

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

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

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

maisumakun

2019/06/12 01:46

空文字列にはマッチする必要がありますか?ありませんか?
akitomo

2019/06/12 01:54 編集

ありがとうございます。 必須ではないですがカラ文字列もあると良いです。 「00000 0」「00000 0」 みたいなのにもアンマッチにできたら嬉しいです。
maisumakun

2019/06/12 01:56

えっと、「0000 0」は「0の連続ではない」のにマッチしないで大丈夫なんですか? (自分が考えていた「空文字列」は、0文字「」の場合です)
mather

2019/06/12 02:07

「0の連続以外」とありますが、「全て数字で構成された文字列があるとして」という前提条件で合ってますか? 任意の文字列 "hogehoge01234" とかだとどうなりますか?
mather

2019/06/12 02:09

全体像を言葉で説明するのが難しい場合はいくつかの具体的な値を提示して「マッチして欲しい例」「アンマッチにして欲しい例」を説明してください。
akitomo

2019/06/12 02:38

0文字「」の場合はマッチで大丈夫です。 絶対にマッチしてほしくない条件は、上記のような、 「0」「00」「000000000」 という0の連続です。 また、できればマッチしてほしくないのが、 「00000 0」「00000 0」「00000 0」「00000  0」 みたいな0の連続およびスペースを含んでいるものです。 ただスペースに関しては必須ではないので、正規表現が複雑になってしまうのであれば、 ひとまず考慮しなくても(マッチになっても)大丈夫です。 そしてそれ以外は全てマッチします。 >「全て数字で構成された文字列があるとして」という前提条件で合ってますか? はい。合っていますが、数字かどうかは別の正規表現で判別するので、考慮しなくて大丈夫です。 「hogehoge01234」これもマッチで構いません。
mather

2019/06/12 02:43

> 数字かどうかは別の正規表現で判別する > 「hogehoge01234」これもマッチで構いません。 「マッチで構いません」ではなく、「ここでは判定対象として出現しないのでマッチでもアンマッチでも無い」ですね。
mather

2019/06/12 02:49

前提条件:空文字""を含む数字(0-9)のみで構成された文字列 具体例(true -> マッチする) "": true "123": true "007": true "0" : false "0000": false ということですね?
akitomo

2019/06/13 01:36

お返事遅くなってすみません。 その通りです。
guest

回答7

0

[^0]+

投稿2019/06/12 01:35

kasa0

総合スコア578

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

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

yambejp

2019/06/12 01:47

空文字のチェックが必要になるかもしれません
kasa0

2019/06/12 01:58

「特定の文字列が」という条件なんですかね? 前提条件がはっきりしないので、単純にマッチしない条件で考えてました。
akitomo

2019/06/13 08:33

回答ありがとうございます。 たぶんこれだと、010とかもアンマッチになってしまうと思います。 それは、マッチ箚せたかったです。
guest

0

実用的には、^0+$とマッチさせて、結果を論理否定すれば良いです。その方が読みやすいプログラムになります。

正規表現でPerl拡張が使える場合は、\A(?!0+\z)と、否定先読みを使うことが出来ます。

投稿2019/06/12 15:20

otn

総合スコア84555

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

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

akitomo

2019/06/13 08:29

ありがとうございます。論理否定できれば良いのですが、仕様的に出来ないので困っていました。
guest

0

愚直にやるなら空文字、または一文字でも1-9の数字が入っていればいいので

^(|[0-9]*[1-9]+[0-9]*)$

となるかな。

投稿2019/06/13 03:13

mather

総合スコア6753

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

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

akitomo

2019/06/13 08:45 編集

ありがとうございます。 これでほぼ問題ありません。
guest

0

ベストアンサー

否定先読み

それ意外であればマッチ

否定先読みを使用して下さい。

JavaScript

1/^(?!0+$)/

文字クラス rev1

もしくは、文字クラスを使用して下さい。

JavaScript

1/[^0]|^$/

基本的に、正規表現で否定条件は、上述の2つ、否定後読みのいずれかを使用して作成します。
http://js-next.hatenablog.com/entry/2015/11/20/083622

文字クラス rev2

また、できればマッチしてほしくないのが、
「00000 0」「00000 0」「00000 0」「00000  0」

前述の否定条件を文字クラスにして、「否定条件となる文字」を入れて下さい。

JavaScript

1/[^0 ]|^$/

検証コード

JavaScript

1'use strict'; 2function notZero1 (string) { return /^(?!0+$)/.test(string); } 3function notZero2 (string) { return /[^0]|^$/.test(string); } 4function notZero3 (string) { return /[^0 ]|^$/.test(string); } 5function notZero4 (string) { return /^(?![0 ]+$)/.test(string); } 6function test (array, fn) { console.log(JSON.stringify(array.map(fn))); } 7 8const array = ['010', '123', '000', '00 000 0000']; 9test(array, notZero1); // [true,true,false,true] 10test(array, notZero2); // [true,true,false,true] 11test(array, notZero3); // [true,true,false,false] 12test(array, notZero4); // [true,true,false,false]

更新履歴

  • 2019/06/13 18:32 2,3番目の正規表現が期待通りに動作しない不具合を修正
  • 2019/06/13 20:34 検証コードを追記

Re: akitomo さん

投稿2019/06/12 22:04

編集2019/06/13 11:35
think49

総合スコア18164

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

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

akitomo

2019/06/13 08:27

ありがとうございます。 一番下のやつだと101とかにもマッチしないので、使えませんでしたが上記2つの方法でやりたいことが実現できました。
think49

2019/06/13 11:36

> 一番下のやつだと101とかにもマッチしないので、使えませんでしたが 親記事を修正しました。
guest

0

^[0 ]+$でマッチを試みて、次にマッチとアンマッチを反転させればいいんじゃないでしょうか。

投稿2019/06/12 04:24

KojiDoi

総合スコア13671

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

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

akitomo

2019/06/13 08:31

回答ありがとうございます。 反転がちょっとよくわかりませんが、 全ての判定を正規表現のみで完結させたかったんです。
guest

0

全てが0の連続の場合はアンマッチ

だと0以外の文字が1文字でもでてきたら、もしくは空ならという条件になります。
たとえば001など一箇所でも0が連続したらアンマッチだと処理がかわってきます。

投稿2019/06/12 01:46

yambejp

総合スコア114839

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

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

yambejp

2019/06/12 02:04

>「00000 0」 をアンマッチにしたいという新たな定義がされていますが これはマッチにしないと命題がぶれます 上記をアンマッチとするなら 「0かスペース(全角含む)だけで構成された文字列はアンマッチ」 のような全然別の定義になります (タブとか改行とかどうするかという別の疑問が発生します) もっと具体的にマッチする例とアンマッチする例を沢山あげてもらわないと いまの状態では回答ができません
guest

0

/(0+)/ でキャピチャーした結果が、元の文字列全体と一致するか? で判定するのは如何でしょう?

投稿2019/06/12 21:40

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問