簡體   English   中英

正則表達式-匹配搜索字符串中單詞的上半部分

[英]Regex - match the better part of a word in a search string

我正在使用Javascript,目前正在尋找一種方法來盡可能匹配我的模式字母,並保持原始順序。

例如, queued的搜索模式應針對以下任何搜索字符串返回行進Queue / queue

  • queueTable

  • scheduledQueueTable

  • qScheduledQueueTable

到目前為止,我已經達到了這一點:

var myregex = new RegExp("([queued])", "i");
var result = myregex.exec('queueTable');

但是它似乎無法正常工作,因為它突出了單詞Table末尾的單個字符queuee

有任何想法嗎?

使用可選的 非捕獲組部分生成正則表達式,其中可以使用Array#reduceRight方法生成正則表達式模式。

 var myregex = new RegExp("queued" .split('') .reduceRight(function(str, s) { return '(?:' + s + str + ')?'; }, ''), "i"); var result = myregex.exec('queueTable'); console.log(result) 

該方法生成regex: /(?:q(?:u(?:e(?:u(?:e(?:d?)?)?)?)?)?)?/


更新:如果要獲得第一個最長的匹配項,請在regex中使用g修飾符,並使用Array#reduce方法找出最大的匹配項。

 var myregex = new RegExp( "queued".split('') .reduceRight(function(str, s) { return '(?:' + s + str + ')?'; }, ''), "ig"); var result = 'qscheduledQueueTable' .match(myregex) .reduce(function(a, b) { return a.length > b.length ? a : b; }); console.log(result); 

我認為邏輯必須是這樣的:

盡可能按順序匹配這些字母。

想到的唯一真正的答案是,如果可能的話,讓比賽繼續進行,但讓其紓困。 在這種情況下...

myregex = /q(?:u(?:e(?:u(?:e(?:d|)|)|)|)|)/;

您當然可以生成:

function matchAsMuchAsPossible(word) { // name me something sensible please!
    return new RegExp(
        word.split("").join("(?:")
        + (new Array(word.length).join("|)"))
    );
}

您正在使用方括號-這意味着它將匹配其中列出的任何字符的單個實例。

有幾種方法可以解釋您的意圖:

您想在單詞隊列末尾加上一個可選的“ d”:

var myregex = new RegExp("queued?", "i");
var result = myregex.exec('queueTable');

請注意,這樣做可以更短一些: 'queueTable'.match(/queued?/i);

我也刪除了括號,因為這些括號未在此處添加任何內容。

該鏈接提供了一些很好的示例,可能會進一步幫助您: https : //www.w3schools.com/js/js_regexp.asp

在正則表達式中使用[]時,表示要匹配方括號內的任何字符。

示例:如果我使用[abc]則表示“匹配單個字符,並且該字符可以是'a','b'或'c'”

因此,在您的代碼中, [queued]意思是“匹配單個字符,並且該字符可以是'q','u','e'或'd'”-請注意,'u'和'e'出現兩次,因此它們在這種情況下是多余的。 這就是為什么此表達式僅匹配一個字符的原因。

如果要匹配整個字符串“排隊”,只需除去括號。 但是在這種情況下,它將不匹配,因為queueTable沒有'd'。 如果希望“ d”為可選,可以使用queued? 如先前答案中已解釋。

嘗試如下操作:

 var myregex = /queued?\\B/g; var result = myregex.exec('queueTable'); console.log(result); 

暫無
暫無

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

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