جاوااسکریپت - چگونه از عبارت باقاعده (regex) برای یافتن تمام جملههایی که ممکن است شامل یک فهرست از کلمات توقف باشند استفاده کنیم؟


هدف یافتن تمام جملاتی است که ممکن است یک فهرست از کلمات توقف را بین عبارت to_match مانند اینها داشته باشند:

  • آرزو کردن
  • آرزو کن
  • یک آرزو کن
let stopword: string[]= ["of", "the", "a"];
let to_match : string = "make wish";
let text: string = "make wish wish make a wish wish wish make the a wish make";

من فقط میتوانم با استفاده از این عبارت منظم، make wish را مطابق کنم:

const regex = new RegExp(`(?:\\b)$to_match(?:\\b)`, "gi"); 

من تعجب میکنم که آیا امکان انجام کاری شبیه به این وجود دارد

let to_match_splitted: string[] = to_match.split(" ");
const regex = `(?:\\b)${to_match_splitted[0]}\s(${any(stopword)}?)+\s${to_match_splited[1]}(?:\\b)`;

با any(stopword) چیزی است که با هر کلمهی توقف در فهرست کلمات توقف مطابقت داشته باشد.

و داشتن یک عبارت منظم (regex) که کار کند هرچه طول to_match_splitted باشد با یک یا چند کلمه توقف بین هر رشته در لیست.

پاسخ شماره ۱

شما میتوانید یک عبارت منظم مانند

/\bmake(?:\s+(?:of|the|a))*\s+wish\b/gi

دموی عبارت منظم را ببینید. جزئیات

  • \b - مرز کلمه
  • make - یک کلمه
  • (?:\s+(?:of|the|a))* - صفر یا چند تکرار

    • \s+ - يک يا چند فضای خالی
    • (?:of|the|a) - یا of، the یا a (ممکن است بخواهید از an? نیز استفاده کنید تا an را هم مطابقت دهد)
  • \s+ - يک يا چند فضای خالی
  • wish - یک کلمه wish
  • \b - مرز کلمه

در کد خود، میتوانید از

let stopword: string[]= ["of", "the", "a"];
let to_match : string = "make wish";
let text: string = "make wish wish make a wish wish wish make the a wish make";
const regex = new RegExp(`\\b${to_match.split(/\s+/).join("(?:\\s+(?:" + stopword.join("|") + "))*\\s+")}\\b`, "gi"); 
console.log(text.match(regex));

نسخه نمایشی آنلاین را ببینید