折疊并捕獲單個(gè)正則表達(dá)式中的重復(fù)模式我不斷遇到需要從字符串中捕獲大量令牌的情況,經(jīng)過無數(shù)次的嘗試后,我找不到簡(jiǎn)化過程的方法。所以我們說文本是:?jiǎn)?dòng):測(cè)試 - 測(cè)試 - LOREM-存有-SIR-doloret - 等 - 等 - 的東西:結(jié)束這個(gè)例子里面有8個(gè)項(xiàng)目,但是說它可能有3到10個(gè)項(xiàng)目。我理想上喜歡這樣的東西:start:(?:(\w+)-?){3,10}:end漂亮而干凈但是它只能抓住最后一場(chǎng)比賽??催@里我通常在簡(jiǎn)單的情況下使用這樣的東西:start:(\w+)-(\w+)-(\w+)-?(\w+)?-?(\w+)?-?(\w+)?-?(\w+)?-?(\w+)?-?(\w+)?-?(\w+)?:end由于最大10限制,3組強(qiáng)制要求和另外7組可選,但這看起來并不“好”,如果最大限制為100且匹配更復(fù)雜,編寫和跟蹤將是一件痛苦的事。演示到目前為止我能做的最好:start:(\w+)-((?1))-((?1))-?((?1))?-?((?1))?-?((?1))?-?((?1))?-?((?1))?:end特別是如果比賽很復(fù)雜但仍然很長(zhǎng)。演示有人設(shè)法讓它作為一個(gè)沒有編程的1正則表達(dá)式解決方案工作?我最感興趣的是如何在PCRE中完成,但其他口味也可以。更新:目的是match 0通過RegEx單獨(dú)驗(yàn)證匹配并捕獲單個(gè)令牌,而不受任何OS /軟件/編程語言限制更新2(賞金):在@nhahtdh的幫助下,我使用以下方法訪問下面的RegExp \G:(?:start:(?=(?:[\w]+(?:-|(?=:end))){3,10}:end)|(?!^)\G-)([\w]+)演示甚至更短,但無需重復(fù)代碼即可進(jìn)行描述我也對(duì)ECMA的味道感興趣,因?yàn)樗恢С謀G想知道是否有另一種方式,特別是不使用/g修飾符。
3 回答

一只斗牛犬
TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊
雖然理論上可以編寫單個(gè)表達(dá)式,但首先匹配外部邊界然后在內(nèi)部部分執(zhí)行拆分更加實(shí)用。
在ECMAScript中,我會(huì)這樣寫:
'start:test-test-lorem-ipsum-sir-doloret-etc-etc-something:end' .match(/^start:([\w-]+):end$/)[1] // match the inner part .split('-') // split inner part (this could be a split regex as well)
在PHP中:
$txt = 'start:test-test-lorem-ipsum-sir-doloret-etc-etc-something:end';if (preg_match('/^start:([\w-]+):end$/', $txt, $matches)) { print_r(explode('-', $matches[1]));}
- 3 回答
- 0 關(guān)注
- 693 瀏覽
添加回答
舉報(bào)
0/150
提交
取消