[英]Find chars in string but prefer consecutive chars with NFA without atomic grouping
我正在嘗試創建一個正則表達式,它將在字符串中的任何地方找到字符。 我希望他們先找到連續的字符。
讓我舉一個例子,假設s = 'this is a test test string'
而我正在搜索tst
我想像這樣找到它:
// Correct
// v vv
s = 'this is a test test string'
並不是:
// Incorrect
// v v v
s = 'this is a test test string'
同樣如果s = 'this is a test test tst string'
// Correct
// vvv
s = 'this is a test test tst string'
需要注意的幾件事:
tst
) 我最好的嘗試是這樣的:
var find = 'tst';
var rStarts = [];
var rEnds = [];
for (var i = 0; i < find.length - 1; i++) {
rStarts.push(= '(' + find[i] + find[i + 1] )
rEnds.push( find[i] + '[^]*?' + find[i + 1] + ')' );
}
但是到了一半,我意識到我不知道我要去哪里。 任何想法如何做到這一點?
好吧,我仍然不確定您要尋找的是什么,但是也許可以嘗試一下:
.*?(t)(s)(t)|.*?(t)(s).*?(t)|.*?(t).*?(s)(t)|(t).*?(s).*?(t)
我在這里捕獲每個字母,但是如果您不介意將它們分組...
.*?(tst)|.*?(ts).*?(t)|.*?(t).*?(st)|(t).*?(s).*?(t)
這將與您在問題中提到的部分匹配。
您可以執行以下操作:
按照您喜歡的順序計算針的所有子串組合的正則表達式,並按順序進行匹配。 因此,對於您的測試,您可以進行以下匹配:
/(tst)/
/(ts).*(t)/
/(t).*(st)/ // <- this one matches
/(t).*(s).*(t)/
計算正則表達式非常棘手,使它們以正確的順序取決於您是否更喜歡4-1-1拆分而不是2-2-2拆分。
這將找到所提供的一組字母的最短集合:
function findChars(chars,string)
{
var rx = new RegExp(chars.split("").join(".*?"),"g");
var finds = [];
while(res = rx.exec(string))
{
finds.push(res[0]);
rx.lastIndex -= res[0].length-1;
}
finds.sort(function(a,b) { return a.length-b.length; })
return finds[0];
}
var s2 = 'this is a test test tst string';
console.log(findChars('tst',s2));//"tst"
console.log(findChars('ess',s2));//"est ts"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.