亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

折疊并捕獲單個正則表達式中的重復模式

折疊并捕獲單個正則表達式中的重復模式

開滿天機 2019-08-13 16:12:49
折疊并捕獲單個正則表達式中的重復模式我不斷遇到需要從字符串中捕獲大量令牌的情況,經過無數次的嘗試后,我找不到簡化過程的方法。所以我們說文本是:啟動:測試 - 測試 - 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]));}


查看完整回答
反對 回復 2019-08-13
  • 3 回答
  • 0 關注
  • 694 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號