簡體   English   中英

查找字符串中的字符,但更喜歡使用不帶原子分組的NFA的連續字符

[英]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
  • 我正在使用javascript,所以我不支持atomi分組,我懷疑這會簡化很多操作

我最好的嘗試是這樣的:

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)

regex101演示

我在這里捕獲每個字母,但是如果您不介意將它們分組...

.*?(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"

您可以使用前瞻來模擬原子團,如本文所述 這個正則表達式似乎想要做什么:

/^(?:(?=(.*?tst))\1|(?=(.*?ts.+?t))\2|(?=(.*?t.+?st))\3|(?=(.*?t.+?s.+?t))\4)/

...或人類可讀的形式:

^
(?:
   (?=(.*?tst))\1
   |
   (?=(.*?ts.+?t))\2
   |
   (?=(.*?t.+?st))\3
   |
   (?=(.*?t.+?s.+?t))\4
)

參考

暫無
暫無

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

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