Bagaimanakah saya boleh menjadikan ungkapan biasa ini lebih mudah?
P粉710454910
P粉710454910 2024-02-26 18:49:18
0
2
340

Saya mempunyai ungkapan biasa ini:

"(WORD1.*WORD2.*WORD3)|(WORD1.*WORD3.*WORD2)|(WORD2.*WORD1.*WORD3)|(WORD2.*WORD3.*WORD1)|(WORD3.*WORD1.*WORD2)|(WORD3.*WORD2.*WORD1)"

Ia sepadan dengan perkataan ini:

WORD1WORD2WORD3
WORD1AWORD2BWORD3C
WORD3WORD1WORD2
WORD1WORD2WORD3WORD1

Tetapi bukan perkataan ini:

WORD1WORD1WORD2
WORD1AWORD1BWORD2C

Regex ini sepadan apabila ia menemui rentetan yang mengandungi 3 perkataan (WORD1WORD2WORD3) dalam sebarang susunan.

Saya mahu melakukan perkara yang sama dengan lebih banyak perkataan, tetapi masalahnya ialah saiz regex berkembang secara eksponen dengan bilangan perkataan. Adakah mungkin untuk memudahkan cara regex ini dibina untuk menyelesaikan masalah ini (tanpa berkembang secara eksponen dalam saiz)?

P粉710454910
P粉710454910

membalas semua(2)
P粉663883862

Cuma lelaran pada semua rentetan dan tapis semua rentetan yang tidak mengandungi semua kata kunci:

(Versi yang lebih ringkas boleh didapati dalam coretan kod di bawah)

function findMatch(strings, keywords) {
  const result = [];
  
  for (const string of strings) {
    if (keywords.every(keyword => string.includes(keyword))) {
      result.push(string);
    }
  }
  
  return result;
}

Cubalah:

console.config({ maximize: true });

function findMatch(strings, keywords) {
  return strings.filter(
    string => keywords.every(keyword => string.includes(keyword))
  );
}

const testcases = [
  'WORD1WORD2WORD3',
  'WORD1AWORD2BWORD3C',
  'WORD3WORD1WORD2',
  'WORD1WORD2WORD3WORD1',
  'WORD1WORD1WORD2',
  'WORD1AWORD1BWORD2C'
];

const keywords = [
  'WORD1', 'WORD2', 'WORD3'
];

console.log(findMatch(testcases, keywords));
sssccc
P粉998100648

Anda boleh menggunakan pandangan positif ke hadapan untuk setiap perkataan.

/(?=.*WORD1)(?=.*WORD2)(?=.*WORD3).*/

Versi yang lebih berprestasi di bawah menentukan sauh permulaan dan hanya sepadan dengan satu aksara selepas mengesahkan pandangan ke hadapan. Mengikut permintaan OP, teknik ini hanya berfungsi dengan matching,而不适用于extraction.

/^(?=.*WORD1)(?=.*WORD2)(?=.*WORD3)./

Pandangan ke hadapan adalah seperti pintu gerbang, ia hanya akan diteruskan jika perlawanan yang dinyatakan dalam kurungan wujud, tetapi ia tidak akan mengambil atau menangkap apa yang sepadan - ia sentiasa panjang sifar. Susunan perkataan tidak penting jika anda "pandang ke hadapan" untuk melihat sama ada terdapat .* mendahului setiap perkataan. Jika setiap perkataan adalah benar, teruskan tanpa menggunakan apa-apa untuk pemadanan. p>

Jika anda hanya mengambil berat tentang sama ada kandungannya sepadan, satu-satunya perbezaan yang ketara antara kedua-dua ungkapan ialah masa yang diambil. Katakan anda hanya mempunyai 2 daripada 3 perkataan yang diperlukan dalam kandungan anda. Melainkan perisian yang mentafsir ungkapan itu dapat mengenali bahawa percubaan itu sia-sia, ia mungkin mencari tiga perkataan "gagal" di kedudukan pertama, kemudian cuba "gagal" di kedudukan kedua, dan seterusnya sehingga ia mencapai kedudukan terakhir naik. Beberapa tangkapan yang tidak perlu boleh dicegah dengan menyatakan ^,只会在第一个位置进行检查,节省了其他不必要检查的时间。当您只是寻找内容中是否存在所有单词的真/假答案时,从末尾删除 *.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!