Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

m文字以内を表す{,m}なんて量指定子は存在しない。…わけではない。

$
0
0

結論

通常?多くの言語で使える正規表現では{,m}は使えず、{0,m},{1,m}を使う必要がある。

が、
(いまのところ見つけられた範囲では)
Rubyやvimなどでは{,m}の書き方が使える。

正規表現エンジンで言うと、
鬼車系とNFAが該当するようだ。


引用記事です。

発端

n文字以内を指定したくて、Googleで「正規表現 以内」で検索。
出てきたページ
正規表現:文字数や、文字数の範囲を指定する表現 | WWWクリエイターズ
を参照。

「〜文字以下」の指定

同様に最小値の指定を省けば、「〜文字以下」の表現となります。

// 10文字以下の半角数字の表現[0-9]{,10}

という記法を発見。
特に言語指定がされていなかったので、一般的な正規表現と思い込む。

サンプルにならい、JavaScriptの正規表現に組み込んだところ、うまく一致しない。

Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript

でチェックしてみても、どうやら正しく動いていないようだ。

JavaScript

正規表現 - JavaScript#特殊文字の使い方 | MDN

ここには{,n}の記述がなかった。
なので、先のサンプルは少なくともJSでは存在しない記法だと考えた。


ではあのサンプルは何でチェックしていたのか?ソラで書いてミスしてしまったものなのか?
卑近な言語の量指定子をついでにチェックしてみた。

Perl

正規表現と言えばPerl。1

perlreref - Perl の正規表現のリファレンス#量指定子 - perldoc.jp

{,n} という量指定子はありません。 これはリテラルな文字列として扱われます。

釘を刺されていた。

Python

6.2. re — 正規表現操作#正規表現のシンタックス — Python 3.6.5 ドキュメント

ないです。

PHP

PHPはPerl互換のPCREとPOSIX正規表現なので、POSIXのほうを

PHP: 繰り返し - Manual

PCREはPerl互換なので見るほどでもなかったかも。

PHP: Perl とは異なる点 - Manual

PHP: POSIX 正規表現との違い - Manual

POSIXの方も指摘されてないので違いはない?

Wiki

正規表現 - Wikipedia

意外と充実してわかりやすそうですが、ない。

その他

正規表現メモ

,n, ,mでチェックしましたが、なさそう。

Ruby

はい、もったいぶりましたが、あるパターン。

正規表現 (Ruby 2.5.0)

(バージョン古い?)

{,m} m回以下(mは数字)

あ り ま し た。

正規表現エンジンを調べる

Rubyの正規表現のエンジンはなんじゃろと検索すると、

Ruby 2.4.1新機能: Onigmo正規表現の非包含演算子(?~ )をチェック

Rubyの正規表現エンジンとしておなじみのOnigmo

鬼車の拡張のよう。

鬼車 正規表現 Version 6.0.0 2016/05/02

{,n}? 零回以上n回以下 (== {0,n}?)

なるほどー。

Vim

なんとなくカバーしてそうだったので記事を書くついでに調べました。

vim正規表現リファレンス#繰返し制御系(量指定子) - Qiita

a\{,m}0回以上 m回以下の aの繰り返しにマッチする。(最長マッチ)

やはりある。
ただ、鬼車は== {0,n}?と言っているので、最短と最長で少し異なるような…?

エンジン調べ

pattern#two-engines - Vim日本語ドキュメント

Vim は二つの正規表現エンジンを持っています:
1. 古い、バックトラッキングエンジン。すべての機能をサポート。
2. 新しい、NFA エンジン。いくつかのパターンで動作が速いがいくつかのパターンで
は遅くなる。

Vim は自動的に適切なエンジンを選択します。何か問題が発生したか、あるいは明示的
にエンジンを選択したいか、あるいはその他の理由で、エンジンを指定したい場合はパ
ターンの先頭で次のように指定します:

pattern#E60 - Vim日本語ドキュメント

\{,m}アトムの 0 以上 m 以下の繰り返し。最長一致
\{-,m}アトムの 0 以上 m 以下の繰り返し。最短一致

なるほど、Vimは最長と最短別々の記法があると。

{すべてViにはない機能です}

さすが。

NFAエンジン

正規表現の詳細仕様(NFAエンジン)

 反復子の {n,m} には、以下のような省略型も存在します。
   {n}   n 回丁度( n >= 0 )
   {n,}   n 回以上( n >= 0 )
   {,m}   0 回以上 m 回以下( m >= 0 )

Vimのほうがさらに拡張されているようだ。

おわり

正規表現を話題にするときは、何の言語(エンジン)を使っているかを少し意識しましょう。
やはり動作環境の掲示は大事。


  1. 個人の感想です。 


Viewing all articles
Browse latest Browse all 5608

Trending Articles