UI設計したり、ウェブシステムを開発したりします。 

SQL見るだけクエリ#270 PHP 正規表現の「貪欲」と「非貪欲」に関して

記入日:2023-10-05 編集日:2023-10-05

PHP 正規表現の「貪欲」と「非貪欲」に関して解説をしてみようと思います。

この記事を読むと(約5分)
PHP 正規表現の「貪欲」と「非貪欲」に関してイメージできます。

PHP 正規表現の「貪欲」と「非貪欲」

正規表現(Regular Expressions)は、文字列のパターンを記述するための強力なツールです。 その中でも、「貪欲」と「非貪欲」は、一致の挙動を制御するための重要な概念です。

1. 貪欲(Greedy)一致:
貪欲な一致は、可能な限り最長の部分文字列を一致させようとします。具体例を見てみましょう。

例1: 正規表現 /a.+b/ で文字列 "aabab" をマッチさせる場合

  • /a は最初の "a" にマッチします。
  • .+ は1文字以上の任意の文字列に一致し、最も長い文字列 "abab" にマッチします。
  • 最後に /b は最後の "b" にマッチします。
結果として、整体として "aabab" がマッチします。

2. 非貪欲(Lazy)一致:
非貪欲な一致は、可能な限り最短の部分文字列を一致させようとします。非貪欲な一致は通常 ? 文字を使って表現されます。

例2: 正規表現 /a.+?b/ で文字列 "aabab" をマッチさせる場合

  • /a は最初の "a" にマッチします。
  • .+? は1文字以上の任意の文字列に一致し、最初の "ab" にマッチします。+? が非貪欲であるため、最短の一致を行います。
  • 最後に /b は次の "b" にマッチします。
結果として、最初の "aab" がマッチします。
この例では、貪欲と非貪欲の違いが明確に現れています。


さらに例を挙げましょう:


例3: 正規表現 /a.*?b/ で文字列 "aabab" をマッチさせる場合
  • /a は最初の "a" にマッチします。
  • .*? は0文字以上の任意の文字列に一致し、最初の "ab" にマッチします。
  • 最後に /b は次の "b" にマッチします。
結果として、最初の "aab" がマッチします。


例4: 正規表現 /a.*b/ で文字列 "aabab" をマッチさせる場合
  • /a は最初の "a" にマッチします。
  • .* は0文字以上の任意の文字列に一致し、最長の文字列 "aabab" にマッチします。
  • 最後に /b は全体の最後の "b" にマッチします。
結果として、全体として "aabab" がマッチします。

このように、正規表現の貪欲性は一致の挙動を制御し、非貪欲な一致を利用することで、最短の一致を行うことができます。

SQLの使いどころ

サイトに大量の情報を掲載することは、ユーザーにとってとても便利なことです。しかし、情報が多すぎると、目的の情報を見つけるのが困難になります。そのため、SQLを使用することで、情報を効率的に管理することができます。

SQLを使用することで、データベース内の情報を検索したり、フィルタリングしたりすることができます。これにより、ユーザーは目的の情報をスムーズかつ簡単に見つけることができます。

また、SQLを使用することで、データを集計したり、統合したりすることもできます。これにより、ユーザーはさまざまな視点から情報を分析することができます。つまり、サイトに多くの情報を掲載することが重要である一方で、その情報を効率的かつ簡単に管理することが求められる場合には、SQLが不可欠であるといえます。

KK

機械工学を専攻。工業デザイナーとして、国内及び海外の自動車・搬送ラインの設計などに従事した後、2003年にウェブシステム会社を設立。UI設計やウェブシステムの開発、DX化のディレクションなどを行っています。