JavaScript: Regex and Multi-line Mode

დღეს აღმოვაჩინე რომ JavaScript – ის Regex იმპლემენტაციას გარდა სხვა ნაკლოვანებებისა ასევე არ გააჩნია ე.წ. “multi-line match mode”. ამ შემთხვევაში ლაპარაკი არ მაქვს რეგულარული გამოსახულების “m” მოდიფიკატორის მხარდაჭერაზე, ლაპარაკი მაქვს “s” მოდიფიკატორზე რომელიც “.“(წერტილი) სიმბოლოს აიძულებს გარდა სხვა სიმბოლოებისა(ნაგულისხმევად “.” ნიშნავს “ნებისმიერი სიმბოლო გარდა ახალი სტრიქონის სიმბოლოსი”) ასევე მოძებნოს ახალი სტრიქონის სიმბოლო.

ჩემი მარტივი ამოცანის გადასაჭრელად საჭირო იყო მოცემულ ტექსტში მეპოვა შემდეგი ტიპის მონაკვეთი:

1
2
3
function myFunction($param1, $param2) {
      return array($param1, $param2);
}

ხოლო ნაპოვნი მონაკვეთიდან ამომეღო {code}{/code} ტაგებს შორის მოქცეული ტექსტი. თუმცა ეს გასაგები მიზეზების გამო არ გამომივიდა.

ნებისმიერ PCRE – სთან თავსებად იმპლემენტაციას გააჩნია “s” მოდიფიკატორი რომლის მეშვეობითაც მსგავსი ამოცანა წყდება ძალიან მარტივად. მაგალითად PHP – ში რეგულარულ გამოსახულებას ჩავწერდით შემდეგნაირად:

1
2
3
//ყურადღება მიაქციეთ გამოსახულების ბოლოში
//მიწერილ "s" სიმბოლოს
$regex = '/{code lang="(\w+)"}(.*?){\/code}/s'

სამწუხაროდ ასეთ გამოსახულებას JavaScript – ში ვერ დავწერთ. თუმცა, ცოტაოდენი კვლევაძიებისა და ექსპერიმენტების შემდგომ მივაგენი გამოსავალს რაც გამოიხატება სპეციფიური ე.წ. character class – ის გამოყენებაში. ამისათვის საჭიროა “\s” და “\S” მეტა სიმბოლოების დაჯგუფება character class – ში. შედეგად მივიღებთ შემდეგ გამოსახულებას:

1
[\s\S]

სადაც “\s” შეესაბამება ნებისმიერ უხილავ სიმბოლოს, ხოლო “\S” შეესაბამება ნებისმიერ არა უხილავ სიმბოლოს.

შედეგად მივიღე ასეთი JavaScript – ის რეგულარული გამოსახულება:

1
/{code\s+lang="(\w+)"}([\s\S]*){\/code}/

ეს გამოსახულება მუშაობს ანალოგიურად PCRE – სთან თავსებადი გამოსახულებისა რომელიც იყენებს “s” მოდიფიკატორს.

ტეგები: ,

2 Responses to “JavaScript: Regex and Multi-line Mode”

  1. მიშელ says:

    მეც მქონდა მსგავსი პრობლემა Multi-line mode თან დაკავშირებით Selenium 1.0 beta 2 – ზე. ბერი წვალების შემდეგ გავარკვიე რომ selenium beta 2 ს Alert-ში არ გააჩნია Multi-line mode-ი, არადა selenium-ის წინა ვერსიებზე(beta 1) Multi-Line Mode-ი მშვენივრად მუშაობდა. ესეც მორიგი ბაგია სელენიუმის რომელიც შემდეგნაირად გადავჭერი:
    1. assertAlert command for old version of selenium(8.3, 1.0 beta 1)

    assertAlert
    Les adresses des lignes sélectionnées sont différentes.Veuillez recommencer votre sélection

    2. assertAlert command for new version of selenium(1.0 beta 2)

    assertAlert
    Les adresses des lignes sélectionnées sont différentes. Veuillez recommencer votre sélection

    მაინტერესებს selenium-ს რამდენად იყენებთ საქართველოში Web-Application – ის ტესტირებისას, ან სხვა Automatic testing systems – ბს web applications-თვის? დროა გადავიდეთ Manual testing-დან Automatic testing system-ზე.

  2. @ მიშელ

    არ ვიცი სელენიუმს რატომ უსვამ ასე მძრაფრად ხაზს და ასე დაჟინებით რატომ კითხულობ მის შესახებ, მაგრამ საქართველო არ არის განყენებული სამყარო რომ არ ვიყენებდეთ ტესტირების ავტომატიზებულ სისტემებს…

    იგივე სელენიუმთან თუ არ ვცდები ჯერ კიდევ 2005 წელს მქონდა შეხება, არცთუ ისე ინტენსიურად ვიყენებ მაგრამ საჭიროების შემთხვევაში არ გავურბივარ…

    ხშირად ვიყენებ PHPUnit – ს და JSUnit – ს ტესტირებისათვის, და Java – ს შემთხვევაში JUnit – ს…

    ეს: “დროა გადავიდეთ Manual testing-დან Automatic testing system-ზე”

    რას ნიშნავს? ძალიან ბევრი დეველოპერი იყენებ Automatic testing სისტემებს… აქ საქართველოში მსგავსი რამ არ გვიკვირს…

დატოვე კომენტარი:

ქართული კლავიატურა, ჩართვა/გამორთვა კლავიშით "~"