[英]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
末尾的單個字符q
, u
, e
, u
, e
和e
。
有任何想法嗎?
使用可選的 非捕獲組部分生成正則表達式,其中可以使用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.