From e062fd0cb2b1531495c8bb7f0949a78e7355d395 Mon Sep 17 00:00:00 2001 From: Saiful Date: Sun, 17 Jan 2021 16:26:06 +0600 Subject: [PATCH 1/3] translate article --- .../14-regexp-lookahead-lookbehind/article.md | 107 +++++++++--------- 1 file changed, 54 insertions(+), 53 deletions(-) diff --git a/9-regular-expressions/14-regexp-lookahead-lookbehind/article.md b/9-regular-expressions/14-regexp-lookahead-lookbehind/article.md index 31393cd03..af1f6460b 100644 --- a/9-regular-expressions/14-regexp-lookahead-lookbehind/article.md +++ b/9-regular-expressions/14-regexp-lookahead-lookbehind/article.md @@ -1,39 +1,39 @@ -# Lookahead and lookbehind +# লুকঅ্যাহেড এবং লুকবিহাইন্ড -Sometimes we need to find only those matches for a pattern that are followed or preceeded by another pattern. +অনেক সময় আমাদের এমন প্যাটার্ন খুঁজা লাগে যা অন্য প্যাটার্নের উপর নির্ভর করে। -There's a special syntax for that, called "lookahead" and "lookbehind", together referred to as "lookaround". +এজন্য রেগুলার এক্সপ্রেশনে একটি বিশেষ সিনট্যাক্স আছে "লুকঅ্যাহেড" এবং "লুকবিহাইন্ড", এদের একত্রে বলা হয় "লুকঅ্যারাউন্ড"। -For the start, let's find the price from the string like `subject:1 turkey costs 30€`. That is: a number, followed by `subject:€` sign. +চলুন একটি ব্যবহারিক উদাহরণ দেখি, `subject:1 turkey costs 30€` এ স্ট্রিং হতে আমরা দাম খুঁজে বের করব। প্যাটার্নটি হবে প্রথমে একটি `subject:€` চিহ্ন তারপর একটি সংখ্যা। -## Lookahead +## লুকঅ্যাহেড -The syntax is: `pattern:X(?=Y)`, it means "look for `pattern:X`, but match only if followed by `pattern:Y`". There may be any pattern instead of `pattern:X` and `pattern:Y`. +সিনট্যাক্সটি হবে: `pattern:X(?=Y)`, এটি দ্বারা বুঝায় এর সাথে মিলবে `pattern:X`, কেবলমাত্র এটি যদি `pattern:Y` দ্বারা শুরু হয়। `pattern:X` এবং `pattern:Y` এর পরিবর্তে যেকোন প্যাটার্ন হতে পারে। -For an integer number followed by `subject:€`, the regexp will be `pattern:\d+(?=€)`: +`subject:€` পর একটি পূর্ণ সংখ্যা হবে, সুতরাং রেগুলার এক্সপ্রেশনটি হবে `pattern:\d+(?=€)`: ```js run let str = "1 turkey costs 30€"; -alert( str.match(/\d+(?=€)/) ); // 30, the number 1 is ignored, as it's not followed by € +alert( str.match(/\d+(?=€)/) ); // 30, 1 এর সাথে মিল হবে না কেননা এর পূর্বে € নাই ``` -Please note: the lookahead is merely a test, the contents of the parentheses `pattern:(?=...)` is not included in the result `match:30`. +লক্ষ্য করুন: লুকঅ্যাহেড হল একটি যাচাই পদ্ধতি, প্যারেন্টেসিসের কন্টেন্ট `pattern:(?=...)` রেজাল্টের মধ্যে আসবে না অর্থাৎ রেজাল্ট হবে `match:30`। -When we look for `pattern:X(?=Y)`, the regular expression engine finds `pattern:X` and then checks if there's `pattern:Y` immediately after it. If it's not so, then the potential match is skipped, and the search continues. +চলুন `pattern:X(?=Y)` কিভাবে কাজ করছে তা বোঝার চেষ্টা করি, রেগুলার এক্সপ্রেশন ইঞ্জিন প্রথমে খুঁজবে `pattern:X` এবং এরপর খুঁজবে `pattern:Y` আছে কিনা। যদি এটি না মেলে, তাহলে ঐ মিলগুলো বাদ দিবে, এবং অনুসন্ধান চালিয়ে যাবে। -More complex tests are possible, e.g. `pattern:X(?=Y)(?=Z)` means: +আমরা আরো জটিল অনুসন্ধানও চালাতে পারি, যেমন `pattern:X(?=Y)(?=Z)` দ্বারা বুঝায়: -1. Find `pattern:X`. -2. Check if `pattern:Y` is immediately after `pattern:X` (skip if isn't). -3. Check if `pattern:Z` is immediately after `pattern:X` (skip if isn't). -4. If both tests passed, then it's the match. +১. প্রথমে `pattern:X` খুঁজবে। +২. পরবর্তী অনুসন্ধান চালাবে যদি `pattern:X` এরপর `pattern:Y` থাকে(অন্যথায় বাদ যাবে)। +৩. পরবর্তী অনুসন্ধান চালাবে যদি `pattern:X` এরপর `pattern:Z` থাকে(অন্যথায় বাদ যাবে)। +৪. যদি উভয়ই অনুসন্ধান মিলে, তাহলে `pattern:X` রেজাল্ট দেখাবে। -In other words, such pattern means that we're looking for `pattern:X` followed by `pattern:Y` and `pattern:Z` at the same time. +অন্য কথায় বলা যায়, আমরা `pattern:X` কে এমনভাবে খুঁজছি যার পরে `pattern:Y` এবং `pattern:Z` থাকবে। -That's only possible if patterns `pattern:Y` and `pattern:Z` aren't mutually exclusive. +এটি অবশ্যই সম্ভব হবে যদি `pattern:Y` এবং `pattern:Z` পরস্পর সাংঘর্ষিক না হয়। -For example, `pattern:\d+(?=\s)(?=.*30)` looks for `pattern:\d+` only if it's followed by a space, and there's `30` somewhere after it: +যেমন, `pattern:\d+(?=\s)(?=.*30)` দ্বারা বুঝায় `pattern:\d+` এরপর একটি স্পেস থাকবে, এবং তারপর যেকোন অবস্থানে `30` থাকবে: ```js run let str = "1 turkey costs 30€"; @@ -41,67 +41,67 @@ let str = "1 turkey costs 30€"; alert( str.match(/\d+(?=\s)(?=.*30)/) ); // 1 ``` -In our string that exactly matches the number `1`. +এক্ষেত্রে আমাদের প্রাপ্ত ফলাফলটি হবে `1`। -## Negative lookahead +## নেগেটিভ লুকঅ্যাহেড -Let's say that we want a quantity instead, not a price from the same string. That's a number `pattern:\d+`, NOT followed by `subject:€`. +চলুন আমরা দামের বদলে পরিমাণ খুঁজে বের করি। সুতরাং সংখ্যাটি হবে `pattern:\d+` যার পরে `subject:€` থাকবে না। -For that, a negative lookahead can be applied. +এজন্য আমরা, নেগেটিভ লুকঅ্যাহেড এর সাহায্য নিতে পারি। -The syntax is: `pattern:X(?!Y)`, it means "search `pattern:X`, but only if not followed by `pattern:Y`". +সিনট্যাক্সটি হবে: `pattern:X(?!Y)`, এটি দ্বারা বুঝায় "`pattern:X` কে খুঁজবে, কেবলমাত্র এরপর যদি `pattern:Y` না থাকে"। ```js run let str = "2 turkeys cost 60€"; -alert( str.match(/\d+(?!€)/) ); // 2 (the price is skipped) +alert( str.match(/\d+(?!€)/) ); // 2 (দামকে বাদ দেয়া হয়েছে) ``` -## Lookbehind +## লুকবিহাইন্ড -Lookahead allows to add a condition for "what follows". +লুকঅ্যাহেড একটি শর্ত আরোপ করে "পরবর্তী অবস্থান"। -Lookbehind is similar, but it looks behind. That is, it allows to match a pattern only if there's something before it. +লুকবিহাইন্ড ও অনুরূপ, কিন্তু এটি পূর্বের অবস্থান খুঁজে। অর্থাৎ এটি মিলবে কেবল প্যাটার্নের পূর্বের কোন একটি প্যাটার্নের সাথে মিললে। -The syntax is: -- Positive lookbehind: `pattern:(?<=Y)X`, matches `pattern:X`, but only if there's `pattern:Y` before it. -- Negative lookbehind: `pattern:(? Date: Sun, 17 Jan 2021 16:48:11 +0600 Subject: [PATCH 2/3] Task 1 --- .../1-find-non-negative-integers/solution.md | 12 ++++++------ .../1-find-non-negative-integers/task.md | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/9-regular-expressions/14-regexp-lookahead-lookbehind/1-find-non-negative-integers/solution.md b/9-regular-expressions/14-regexp-lookahead-lookbehind/1-find-non-negative-integers/solution.md index a824409f9..bdd7589a9 100644 --- a/9-regular-expressions/14-regexp-lookahead-lookbehind/1-find-non-negative-integers/solution.md +++ b/9-regular-expressions/14-regexp-lookahead-lookbehind/1-find-non-negative-integers/solution.md @@ -1,9 +1,9 @@ -The regexp for an integer number is `pattern:\d+`. +পূর্ণসংখ্যার রেগুলার এক্সপ্রেশন হল `pattern:\d+`। -We can exclude negatives by prepending it with the negative lookahead: `pattern:(? Date: Sun, 17 Jan 2021 18:03:12 +0600 Subject: [PATCH 3/3] task 2 --- .../2-insert-after-head/solution.md | 23 ++++++++++++------- .../2-insert-after-head/task.md | 12 +++++----- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/9-regular-expressions/14-regexp-lookahead-lookbehind/2-insert-after-head/solution.md b/9-regular-expressions/14-regexp-lookahead-lookbehind/2-insert-after-head/solution.md index 980a7fe66..a997c7b62 100644 --- a/9-regular-expressions/14-regexp-lookahead-lookbehind/2-insert-after-head/solution.md +++ b/9-regular-expressions/14-regexp-lookahead-lookbehind/2-insert-after-head/solution.md @@ -1,9 +1,9 @@ +`` ট্যাগ ভিতরে নতুন ট্যাগ স্থাপনের জন্য, আমাদের প্রথমে এটি খুঁজে বের করতে হবে। এজন্য আমরা এই রেগুলার এক্সপ্রেশনটি ব্যবহার করব `pattern:`। -Для того, чтобы вставить после тега ``, нужно вначале его найти. Будем использовать регулярное выражение `pattern:`. +এই টাস্কের জন্য আমাদের `` ট্যাগকে প্রতিস্থাপিত করা লাগবে না। আমাদের শুধুমাত্র ট্যাক্সটিকে সংযোগ করতে হবে। -Далее, нам нужно оставить сам тег `` на месте и добавить текст после него. +এখানে দেখুন আমরা কিভাবে এটি করতে পারি: -Это можно сделать вот так: ```js run let str = '......'; str = str.replace(//, '$&

Hello

'); @@ -11,9 +11,9 @@ str = str.replace(//, '$&

Hello

'); alert(str); // ...

Hello

... ``` -В строке замены `$&` означает само совпадение, то есть мы заменяем `pattern:` заменяется на самого себя плюс `

Hello

`. +রিপ্লেসমেন্ট স্ট্রিংয়ে `$&` দ্বারা বুঝায় মিলের কন্টেন্টটি অর্থাৎ সোর্সের ট্যাক্সটি `pattern:`। মিলকৃত কন্টেন্টটি অতঃপর `

Hello

`। -Альтернативный вариант - использовать ретроспективную проверку: +বিকল্প আরেকটি হতে পারে লুকবিহাইন্ড: ```js run let str = '......'; @@ -22,8 +22,15 @@ str = str.replace(/(?<=)/, `

Hello

`); alert(str); // ...

Hello

... ``` -Такое регулярное выражение на каждой позиции будет проверять, не идёт ли прямо перед ней `pattern:`. Если да - совпадение найдено. Но сам тег `pattern:` в совпадение не входит, он только участвует в проверке. А других символов после проверки в нём нет, так что текст совпадения будет пустым. +এখানে দেখতে পাচ্ছি, এখানে রেগুলার এক্সপ্রেশনে শুধুমাত্র লুকবিহাইন্ডের অংশটি আছে। -Происходит замена "пустой строки", перед которой идёт `pattern:` на `

Hello

`. Что, как раз, и есть вставка этой строки после ``. +এটি এভাবে কাজ করছে: +- টেক্সটের প্রতিটি পজিশনে। +- যাচাই করছে পূর্বে `pattern:` আছে কিনা। +- যদি থাকে তাহলে আমাদের মিলটি পাব। -P.S. Этому регулярному выражению не помешают флаги: `pattern://si`, чтобы в "точку" входил перевод строки (тег может занимать несколько строк), а также чтобы теги в другом регистре типа `match:` тоже находились. +`pattern:` ট্যাগটি রিটার্ন করবে না। সুতরাং রেজাল্ট হবে এম্পটি স্ট্রিং, কিন্ত ম্যাচটির অবস্থান হবে `pattern:` এর পরের অবস্থানটি। + +সুতরা আমরা "empty line" টিকে রিপ্লেস করব `

Hello

` দ্বারা যার পূর্বে `pattern:` আছে। সুতরাং নতুন ট্যাগটি হবে `` এর পর। + +লক্ষ্যনীয় রেগুলার এক্সপ্রেশন ফ্ল্যাগ, যেমন `pattern:s` এবং `pattern:i` দরকারী: `pattern://si`। `pattern:s` ফ্ল্যাগটি `pattern:.` দ্বারা নিউলাইন ক্যারাক্টারকেও বুঝায়, এবং `pattern:i` ফ্ল্যাগ কেস-ইন্সেসিটিভ বুঝায় `pattern:` এটি `match:` এর সাথেও ম্যাচ করবে। diff --git a/9-regular-expressions/14-regexp-lookahead-lookbehind/2-insert-after-head/task.md b/9-regular-expressions/14-regexp-lookahead-lookbehind/2-insert-after-head/task.md index ac9e5e4ce..bf455cc4a 100644 --- a/9-regular-expressions/14-regexp-lookahead-lookbehind/2-insert-after-head/task.md +++ b/9-regular-expressions/14-regexp-lookahead-lookbehind/2-insert-after-head/task.md @@ -1,13 +1,13 @@ -# Вставьте после фрагмента +# Body এর ভিতরে H1 ট্যাগ -Есть строка с HTML-документом. +HTML Document এর একটি স্ট্রিং আছে। -Вставьте после тега `` (у него могут быть атрибуты) строку `

Hello

`. +একটি রেগুলার এক্সপ্রেশন লিখুন যার মাধ্যমে `` ট্যাগ এর পর `

Hello

` কে সংযোগ করতে পারি। ট্যাগটির একাধিক অ্যাট্রিবিউট থাকতে পারে। -Например: +উদাহরণস্বরূপ: ```js -let regexp = /ваше регулярное выражение/; +let regexp = /আপনার প্যাটার্ন/; let str = ` @@ -20,7 +20,7 @@ let str = ` str = str.replace(regexp, `

Hello

`); ``` -После этого значение `str`: +এর পর `str` এর মান হবে: ```html

Hello