პოზიტიური და ნეგატიური ნახვა ჯავასკრიპტის რეგულარულ გამონათქვამებში
ზოგჯერ საჭიროა ამ类型的 ამოცანის ამოხსნა: მოძებნოთ
სტრიქონი 'aaa' და შეცვალოთ იგი '!'-ით,
მაგრამ მხოლოდ იმ შემთხვევაში, თუ 'aaa'-ის შემდეგ
დგას 'x', თავად 'x' კი არ შეიცვალოს. თუ ამოცანის
ამოხსნას 'პირდაპირ' ვეცდებით, არაფერი გამოგვივა:
'aaax baaa'.replace(/aaax/g, '!'); // დააბრუნებს '! baaa', მაგრამ ჩვენ გვინდოდა '!x baaa'
წინ ნახვა
ამოცანის ამოსახსნელად საჭიროა გზა, რომ ვთქვათ,
რომ 'x' არ უნდა შეიცვალოს. ეს კეთდება
განსაკუთრებული ფრჩხილების (?= ) მეშვეობით,
რომლებიც მხოლოდ აკვირდებიან, მაგრამ არ იღებენ თან.
ამ ფრჩხილებს ეწოდება პოზიტიური წინ ნახვა. პოზიტიური - რადგან 'x'
(ჩვენს შემთხვევაში) უნდა იყოს - მხოლოდ მაშინ მოხდება
შეცვლა.
მოდით გამოვიყენოთ ეს ფრჩხილები ჩვენი ამოცანის ამოსახსნელად:
'aaax aaab'.replace(/aaa(?=x)/g, '!'); // დააბრუნებს '!x aaab'
არსებობს ნეგატიური წინ ნახვაც
- (?! ) - ის, პირიქით, ამბობს, რომ
რაღაც არ უნდა იყოს. შემდეგ მაგალითში,
შეცვლა მოხდება მხოლოდ იმ შემთხვევაში, თუ 'aaa'-ის შემდეგ
არ დგას 'x':
'aaax aaab'.replace(/aaa(?!x)/g, '!'); // დააბრუნებს 'aaax !b'
უკან ნახვა
ანალოგიურად არსებობს პოზიტიური უკან ნახვა
- (?<= ). შემდეგ
მაგალითში შეცვლა მოხდება მხოლოდ იმ შემთხვევაში, თუ
'aaa'-ის წინ დგას 'x':
'xaaa'.replace(/(?<=x)aaa/g, '!'); // დააბრუნებს 'x!'
და ასევე არსებობს ნეგატიური უკან ნახვაც
- (?<! ). შემდეგ მაგალითში შეცვლა
მოხდება მხოლოდ იმ შემთხვევაში, თუ 'aaa'-ის წინ
არ დგას 'x':
'baaa'.replace(/(?<!x)aaa/g, '!'); // დააბრუნებს 'b!'
პრაქტიკული ამოცანები
მოცემულია სტრიქონი, რომელიც შეიცავს ფუნქციების სახელებს:
let str = 'func1() func2() func3()';
მიიღეთ ფუნქციების სახელების მასივი სტრიქონიდან.
მოცემულია სტრიქონი ტეგით:
let str = '<a href="" class="eee" id="zzz">';
მიიღეთ ამ ტეგის ატრიბუტების სახელების მასივი.
მოცემულია სტრიქონი ცვლადებით:
let str = '$aaa $bbb $ccc xxxx';
მიიღეთ ქვესტრიქონები, რომლების წინაც დგას დოლარის სიმბოლო.