簡體   English   中英

ES5 Regex測試以任意順序查找一組字符

[英]ES5 Regex test find a set of characters in any order

假設我想在字典中找到一個包含任意順序給定字母的單詞。 對於我的示例,我的正則表達式字符集包含[jock]。 我一直在嘗試創建一個函數來創建這樣的正則表達式測試:

/*
** Function: Take an array of 2 strings. Return TRUE if all letters
**           of 2nd string are within 1st string, letters can be any order,
**            case-sensitivity does not matter.
**
** @param    {array} where arr[0] word to check, arr[1] string of characters
** @returns  {array} 
*/
function matchAllLetters(arr) {
  'use strict';

  // flags: i - case insensitive, g - global match

  var pattern = new RegExp("[" + arr[0] + "+]", "ig"); 

  return ( pattern.test( arr[1] ) );
}
matchAllLetters(['jackal','jock']); //true, s/b false

我知道除了使用RegExp可以解決此問題以外,還有其他方法,但是我想使用RegExp解決此問題,以便可以將RegExp與JSPerf的另一種方法進行比較。

問題在於正則表達式返回true,因為它與set的一個字符匹配, 可以在regex101進行檢查以匹配整個字符串錨點,並且必須按照@Ryan的建議添加量詞。

^[jackal]+$

請注意, a是多余的,因為它在字符集中出現了兩次。

您可以將正則表達式與

  • ^開始位置
  • []字符類,可能為空
  • *從零開始直到無限時間的貪婪量詞(空字符類需要)
  • $字符串的結束位置

 'use strict'; function matchAllLetters(arr) { var pattern = new RegExp("^[" + arr[0] + "]*$", "ig"); return pattern.test(arr[1]); } console.log(matchAllLetters(['jackal', 'jock'])); console.log(matchAllLetters(['', ''])); console.log(matchAllLetters(['jackal', 'jack'])); 

Nahuel的回答將我引向正確的方向。 在較早的嘗試中,我嘗試將字符串“ jock”作為字符模式傳遞給正則表達式以匹配字符串。 字母“ j”,“ o”,“ c”,“ k”的集合可以按字符串的任何順序找到,只要在字符串中找到它們即可。 正如Nahuel指出的那樣,我不能只接受'jock'字符串並用字符類[]包圍它,因為即使集合中只有1個字符匹配,而其余字符都不匹配,則regex返回TRUE。 關於堆棧溢出的Java Regex討論幫助我重寫了函數,以構建“正向超前”正則表達式測試。

function matchAllLetters(arr) {

  var len= arr[1].length;
  var lookahead = [];

  for (var i = 0; i < len; i++) {
    lookahead += "(?=.*" + arr[1].charAt(i) + ")";
  }

  var pattern = new RegExp(lookahead, "i"); 
  return ( pattern.test( arr[0] ) );
}

該功能按預期工作。 但是如上所述,整個目的是查看Regex是否以這種方式比其他方法更快地進行模式匹配。 對於那些感興趣的人,可以在這里找到我的JSPerf測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM