Skip to content

7. بیان‌های منظم

Image

7.1. اسکریپت [regex-01]

در دوره PHP، از کد زیر برای تشریح عبارت‌های منظم از PHP 7 استفاده کردیم:


<?php

// نوع سخت‌گیرانه برای پارامترهای تابع
declare (strict_types=1);

// بیان‌های منظم در PHP
// استخراج فیلدهای مختلف از یک رشته
//الگو: دنباله‌ای از ارقام که توسط هر کاراکتری احاطه شده باشد
// ما فقط می‌خواهیم دنبالهٔ ارقام را استخراج کنیم
$modèle = "/(\d+)/";
// ما رشته را با الگو مقایسه می‌کنیم
compareModele2Chaine($modèle, "xyz1234abcd");
compareModele2Chaine($modèle, "12 34");
compareModele2Chaine($modèle, "abcd");

//الگو: دنباله‌ای از ارقام که توسط هر کاراکتری احاطه شده است
// ما می‌خواهیم دنبالهٔ ارقام و همچنین فیلدهایی را که قبل و بعد از آن می‌آیند، استخراج کنیم
$modèle = "/^(.*?)(\d+)(.*?)$/";
// ما رشته را با الگو مطابقت می‌دهیم
compareModele2Chaine($modèle, "xyz1234abcd");
compareModele2Chaine($modèle, "12 34");
compareModele2Chaine($modèle, "abcd");

//الگو – یک تاریخ در قالب dd/mm/yy
$modèle = "/^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/";
compareModele2Chaine($modèle, "10/05/97");
compareModele2Chaine($modèle, "  04/04/01  ");
compareModele2Chaine($modèle, "5/1/01");

//الگو – یک عدد اعشاری
$modèle = "/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*/";
compareModele2Chaine($modèle, "187.8");
compareModele2Chaine($modèle, "-0.6");
compareModele2Chaine($modèle, "4");
compareModele2Chaine($modèle, ".6");
compareModele2Chaine($modèle, "4.");
compareModele2Chaine($modèle, " + 4");

//پایان
exit;

// --------------------------------------------------------------------------
function compareModele2Chaine(string $modèle, string $chaîne): void {
  //رشته $chaîne را با قالب $modèle مقایسه می‌کند
  // رشته با قالب مقایسه می‌شود
  $champs = [];
  $correspond = preg_match($modèle, $chaîne, $champs);
  // نمایش نتایج
  print "\nRésultats($modèle,$chaîne)\n";
  if ($correspond) {
    for ($i = 0; $i < count($champs); $i++) {
      print "champs[$i]=$champs[$i]\n";
    }
  } else {
    print "La chaîne [$chaîne] ne correspond pas au modèle [$modèle]\n";
  }
}

ما این کد را به صورت زیر به جاوااسکریپت منتقل می‌کنیم:


'use strict';

/// عبارات باقاعده در جاوااسکریپت
//استخراج فیلدهای مختلف از یک رشته
//الگو: دنباله‌ای از ارقام که توسط هر کاراکتری احاطه شده است
// ما فقط می‌خواهیم دنباله ارقام را استخراج کنیم
let modèle = /(\d+)/;
// ما رشته را با الگو مقایسه می‌کنیم
compareModèleToChaîne(modèle, "xyz1234abcd");
compareModèleToChaîne(modèle, "12 34");
compareModèleToChaîne(modèle, "abcd");

//الگو: دنباله‌ای از ارقام که توسط کاراکترهای دلخواه احاطه شده است
// ما می‌خواهیم دنبالهٔ ارقام و همچنین فیلدهایی را که قبل و بعد از آن می‌آیند
modèle = /^(.*?)(\d+)(.*?)$/;
// رشته با الگو مقایسه می‌شود
compareModèleToChaîne(modèle, "xyz1234abcd");
compareModèleToChaîne(modèle, "12 34");
compareModèleToChaîne(modèle, "abcd");

//الگو – یک تاریخ در قالب dd/mm/yy
modèle = /^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/;
compareModèleToChaîne(modèle, "10/05/97");
compareModèleToChaîne(modèle, "  04/04/01  ");
compareModèleToChaîne(modèle, "5/1/01");

//الگو – یک عدد اعشاری
modèle = /^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$/;
compareModèleToChaîne(modèle, "187.8");
compareModèleToChaîne(modèle, "-0.6");
compareModèleToChaîne(modèle, "4");
compareModèleToChaîne(modèle, ".6");
compareModèleToChaîne(modèle, "4.");
compareModèleToChaîne(modèle, " + 4");

// --------------------------------------------------------------------------
function compareModèleToChaîne(modèle, chaîne) {
  //رشته [chaîne] را با الگوی [modèle] مقایسه می‌کند
  console.log(`----------- chaîne=${chaîne}, modèle=${modèle}`)
  // رشته با الگو مقایسه می‌شود
  const result1 = modèle.exec(chaîne);
  console.log(`comparaison avec exec=`, result1);
  // راه دیگری برای انجام آن
  const result2 = chaîne.match(modèle);
  console.log(`comparaison avec match=`, result2);
}

نظرات

  • کدهای PHP و جاوااسکریپت بسیار شبیه به هم هستند؛
  • خط ۷: توجه داشته باشید که در جاوااسکریپت، عبارت منظم یک رشته نیست بلکه یک شیء است. هیچ علامت نقل قول یا گیومه دور عبارت قرار نمی‌گیرد؛
  • خطوط ۴۱ و ۴۴: دو روش برای رسیدن به نتیجه یکسان وجود دارد؛

اجرا


[Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\javascript\regexp\regexp-01.js"
type d'une expression régulière : object
----------- chaîne=xyz1234abcd, modèle=/(\d+)/
comparaison avec exec= [ '1234',
'1234',
index: 3,
input: 'xyz1234abcd',
groups: undefined ]
comparaison avec match= [ '1234',
'1234',
index: 3,
input: 'xyz1234abcd',
groups: undefined ]
----------- chaîne=12 34, modèle=/(\d+)/
comparaison avec exec= [ '12', '12', index: 0, input: '12 34', groups: undefined ]
comparaison avec match= [ '12', '12', index: 0, input: '12 34', groups: undefined ]
----------- chaîne=abcd, modèle=/(\d+)/
comparaison avec exec= null
comparaison avec match= null
----------- chaîne=xyz1234abcd, modèle=/^(.*?)(\d+)(.*?)$/
comparaison avec exec= [ 'xyz1234abcd',
'xyz',
'1234',
'abcd',
index: 0,
input: 'xyz1234abcd',
groups: undefined ]
comparaison avec match= [ 'xyz1234abcd',
'xyz',
'1234',
'abcd',
index: 0,
input: 'xyz1234abcd',
groups: undefined ]
----------- chaîne=12 34, modèle=/^(.*?)(\d+)(.*?)$/
comparaison avec exec= [ '12 34',
'',
'12',
' 34',
index: 0,
input: '12 34',
groups: undefined ]
comparaison avec match= [ '12 34',
'',
'12',
' 34',
index: 0,
input: '12 34',
groups: undefined ]
----------- chaîne=abcd, modèle=/^(.*?)(\d+)(.*?)$/
comparaison avec exec= null
comparaison avec match= null
----------- chaîne=10/05/97, modèle=/^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/
comparaison avec exec= [ '10/05/97',
'10',
'05',
'97',
index: 0,
input: '10/05/97',
groups: undefined ]
comparaison avec match= [ '10/05/97',
'10',
'05',
'97',
index: 0,
input: '10/05/97',
groups: undefined ]
----------- chaîne= 04/04/01 , modèle=/^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/
comparaison avec exec= [ ' 04/04/01 ',
'04',
'04',
'01',
index: 0,
input: ' 04/04/01 ',
groups: undefined ]
comparaison avec match= [ ' 04/04/01 ',
'04',
'04',
'01',
index: 0,
input: ' 04/04/01 ',
groups: undefined ]
----------- chaîne=5/1/01, modèle=/^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/
comparaison avec exec= null
comparaison avec match= null
----------- chaîne=187.8, modèle=/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$/
comparaison avec exec= [ '187.8',
'',
'187.8',
index: 0,
input: '187.8',
groups: undefined ]
comparaison avec match= [ '187.8',
'',
'187.8',
index: 0,
input: '187.8',
groups: undefined ]
----------- chaîne=-0.6, modèle=/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$/
comparaison avec exec= [ '-0.6', '-', '0.6', index: 0, input: '-0.6', groups: undefined ]
comparaison avec match= [ '-0.6', '-', '0.6', index: 0, input: '-0.6', groups: undefined ]
----------- chaîne=4, modèle=/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$/
comparaison avec exec= [ '4', '', '4', index: 0, input: '4', groups: undefined ]
comparaison avec match= [ '4', '', '4', index: 0, input: '4', groups: undefined ]
----------- chaîne=.6, modèle=/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$/
comparaison avec exec= [ '.6', '', '.6', index: 0, input: '.6', groups: undefined ]
comparaison avec match= [ '.6', '', '.6', index: 0, input: '.6', groups: undefined ]
----------- chaîne=4., modèle=/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$/
comparaison avec exec= [ '4.', '', '4.', index: 0, input: '4.', groups: undefined ]
comparaison avec match= [ '4.', '', '4.', index: 0, input: '4.', groups: undefined ]
----------- chaîne= + 4, modèle=/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*$/
comparaison avec exec= [ ' + 4', '+', '4', index: 0, input: ' + 4', groups: undefined ]
comparaison avec match= [ ' + 4', '+', '4', index: 0, input: ' + 4', groups: undefined ]

متدهای [regexp.exec] و [string.match] نتایج یکسانی تولید می‌کنند:

  • [null] اگر تطابقی بین رشته و قالب آن وجود نداشته باشد؛
  • یک آرایه t، در صورتی که تطابقی با:
    • t[0]: رشته‌ای که با الگو مطابقت دارد؛
    • t[1]: رشته‌ای که با پرانتز اول الگو مطابقت دارد؛
    • t[2]: رشته‌ای که با پرانتز دوم در قالب مطابقت دارد؛
    • t[input]: کل رشته‌ای که الگو در آن جستجو شده است؛

7.2. اسکریپت [regexp-02]

گاهی اوقات نمی‌خواهید عناصر را از رشته در حال آزمایش استخراج کنید، بلکه صرفاً می‌خواهید بدانید که آیا با الگو مطابقت دارد یا خیر:


'use strict';

/// عبارات باقاعده در جاوااسکریپت
// استخراج فیلدهای مختلف از یک رشته
//الگو: دنباله‌ای از ارقام که توسط هر کاراکتری احاطه شده است
// ما فقط می‌خواهیم دنباله ارقام را استخراج کنیم
let modèle = /\d+/;
console.log("type d'une expression régulière : ", typeof (modèle));
// ما رشته را با الگو مطابقت می‌دهیم
compareModèleToChaîne(modèle, "xyz1234abcd");
compareModèleToChaîne(modèle, "12 34");
compareModèleToChaîne(modèle, "abcd");

//الگو: دنباله‌ای از ارقام که توسط هر کاراکتری احاطه شده است
// ما می‌خواهیم دنباله ارقام و همچنین فیلدهای بلافاصله قبل و بعد از آن را
modèle = /^.*?\d+.*?$/;
// ما رشته را با الگو مطابقت می‌دهیم
compareModèleToChaîne(modèle, "xyz1234abcd");
compareModèleToChaîne(modèle, "12 34");
compareModèleToChaîne(modèle, "abcd");

//الگو – یک تاریخ در قالب dd/mm/yy
modèle = /^\s*\d\d\/\d\d\/\d\d\s*$/;
compareModèleToChaîne(modèle, "10/05/97");
compareModèleToChaîne(modèle, "  04/04/01  ");
compareModèleToChaîne(modèle, "5/1/01");

//الگو – یک عدد اعشاری
modèle = /^\s*[+|-]?\s*\d+\.\d*|\.\d+|\d+\s*$/;
compareModèleToChaîne(modèle, "187.8");
compareModèleToChaîne(modèle, "-0.6");
compareModèleToChaîne(modèle, "4");
compareModèleToChaîne(modèle, ".6");
compareModèleToChaîne(modèle, "4.");
compareModèleToChaîne(modèle, " + 4");

// --------------------------------------------------------------------------
function compareModèleToChaîne(modèle, chaîne) {
  // آزمایش
  const correspond = modèle.test(chaîne);
  //  رشته [chaîne] را با الگوی [modèle] مقایسه می‌کند
  console.log(`----------- chaîne=${chaîne}, modèle=${modèle}, correspond=${correspond}`);
}

توضیحات

  • [regexp-02] از همان کدی که در [regexp-01] استفاده می‌شود بهره می‌برد، با تفاوت‌های زیر:
    • ما نمی‌خواهیم عناصری را از رشته در حال آزمایش استخراج کنیم. بنابراین، ما پرانتزها را از عبارت‌های منظم مورد استفاده حذف کرده‌ایم؛
    • خط ۴۰: ما از متد [Regexp.test] برای بررسی اینکه آیا یک رشته با یک عبارت منظم مطابقت دارد، استفاده می‌کنیم؛

نتایج اجرای کد به شرح زیر است:


[Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\cours\regexp\regexp-02.js"
type d'une expression régulière :  object
----------- chaîne=xyz1234abcd, modèle=/\d+/, correspond=true
----------- chaîne=12 34, modèle=/\d+/, correspond=true
----------- chaîne=abcd, modèle=/\d+/, correspond=false
----------- chaîne=xyz1234abcd, modèle=/^.*?\d+.*?$/, correspond=true
----------- chaîne=12 34, modèle=/^.*?\d+.*?$/, correspond=true
----------- chaîne=abcd, modèle=/^.*?\d+.*?$/, correspond=false
----------- chaîne=10/05/97, modèle=/^\s*\d\d\/\d\d\/\d\d\s*$/, correspond=true
----------- chaîne=  04/04/01  , modèle=/^\s*\d\d\/\d\d\/\d\d\s*$/, correspond=true
----------- chaîne=5/1/01, modèle=/^\s*\d\d\/\d\d\/\d\d\s*$/, correspond=false
----------- chaîne=187.8, modèle=/^\s*[+|-]?\s*\d+\.\d*|\.\d+|\d+\s*$/, correspond=true
----------- chaîne=-0.6, modèle=/^\s*[+|-]?\s*\d+\.\d*|\.\d+|\d+\s*$/, correspond=true
----------- chaîne=4, modèle=/^\s*[+|-]?\s*\d+\.\d*|\.\d+|\d+\s*$/, correspond=true
----------- chaîne=.6, modèle=/^\s*[+|-]?\s*\d+\.\d*|\.\d+|\d+\s*$/, correspond=true
----------- chaîne=4., modèle=/^\s*[+|-]?\s*\d+\.\d*|\.\d+|\d+\s*$/, correspond=true
----------- chaîne= + 4, modèle=/^\s*[+|-]?\s*\d+\.\d*|\.\d+|\d+\s*$/, correspond=true

[Done] exited with code=0 in 0.269 seconds