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

一只斗牛犬
TA貢獻1784條經驗 獲得超2個贊
雖然理論上可以編寫單個表達式,但首先匹配外部邊界然后在內部部分執行拆分更加實用。
在ECMAScript中,我會這樣寫:
'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 關注
- 694 瀏覽
添加回答
舉報
0/150
提交
取消