ตัวดำเนินการกำหนดจำนวนการซ้ำของตัวอักษรใน Regular Expressions

มีบางสถานการณ์ที่เราต้องการระบุว่า ตัวอักษรซ้ำตามจำนวนที่กำหนด หากเราทราบจำนวนครั้งที่แน่นอน เราก็สามารถเขียนมันหลายครั้งได้ - #aaaa# แต่จะทำอย่างไรหากเราต้องการ พูดว่า: ซ้ำหนึ่งครั้งหรือมากกว่า?

สำหรับสิ่งนี้มีตัวดำเนินการ (quantifiers) กำหนดจำนวนการซ้ำ: เครื่องหมายบวก + (หนึ่งครั้งหรือมากกว่า), เครื่องหมายดอกจัน * (ศูนย์ครั้งหรือมากกว่า) และ เครื่องหมายคำถาม ? (ศูนย์หรือหนึ่งครั้ง) ตัวดำเนินการเหล่านี้ ส่งผลต่อตัวอักษรที่อยู่หน้าพวกมัน

ลองดูการทำงานของตัวดำเนินการเหล่านี้ จากตัวอย่าง

ตัวอย่าง

ลองหาสตริงย่อยทั้งหมดตามรูปแบบ ตัวอักษร 'x', ตัวอักษร 'a' ซ้ำหนึ่งครั้งหรือมากกว่า, ตัวอักษร 'x':

php<?php
  $str = 'xx xax xaax xaaax xbx';
  $res = preg_replace('#xa+x#', '!', $str);
?>

ผลลัพธ์ที่ได้ในตัวแปรจะเป็นดังนี้:

php'xx ! ! ! xbx'

ตัวอย่าง

ลองหาสตริงย่อยทั้งหมดตามรูปแบบ ตัวอักษร 'x', ตัวอักษร 'a' ซ้ำศูนย์ครั้งหรือมากกว่า, ตัวอักษร 'x':

php<?php
  $str = 'xx xax xaax xaaax xbx';
  $res = preg_replace('#xa*x#', '!', $str);
?>

ผลลัพธ์ที่ได้ในตัวแปรจะเป็นดังนี้:

php'! ! ! ! xbx'

ตัวอย่าง

ลองหาสตริงย่อยทั้งหมดตามรูปแบบ ตัวอักษร 'x', ตัวอักษร 'a' ซ้ำศูนย์หรือหนึ่งครั้ง, ตัวอักษร 'x':

php<?php
  $str = 'xx xax xaax xbx';
  $res = preg_replace('#xa?x#', '!', $str);
?>

ผลลัพธ์ที่ได้ในตัวแปรจะเป็นดังนี้:

php'! ! xaax xbx'

โจทย์ฝึกหัด

Задание 1

กำหนดสตริง:

php<?php
  $str = 'aa aba abba abbba abca abea';
?>

เขียน regular expression ที่จะค้นหาสตริง ตามรูปแบบ: ตัวอักษร 'a', ตัวอักษร 'b' หนึ่งครั้งหรือมากกว่า, ตัวอักษร 'a'

Задание 2

กำหนดสตริง:

php<?php
  $str = 'aa aba abba abbba abca abea';
?>

เขียน regular expression ที่จะค้นหาสตริง ตามรูปแบบ: ตัวอักษร 'a', ตัวอักษร 'b' ศูนย์ครั้งหรือมากกว่า, ตัวอักษร 'a'

Задание 3

กำหนดสตริง:

php<?php
  $str = 'aa aba abba abbba abca abea';
?>

เขียน regular expression ที่จะค้นหาสตริง ตามรูปแบบ: ตัวอักษร 'a', ตัวอักษร 'b' หนึ่งครั้งหรือไม่มีเลย, ตัวอักษร 'a'

Задание 4

กำหนดสตริง:

php<?php
  $str = 'aa aba abba abbba abca abea';
?>

เขียน regular expression ที่จะค้นหาสตริง 'aa', 'aba', 'abba', 'abbba', โดยไม่เก็บ 'abca' และ 'abea'