2017-08-28 64 views
1

我正在研究支持以字母開頭的命名參數的Xregexp表達式。這裏是我的表達:Xregexp javascript可選命名組由空格隔開

(?:d:|duration:)(?<time>.*\S+).*(?:t:|title:)(?<title>(?:.*\S+))(?:.*(?:(?:p:|prize:)(?<prize>.*\S+))) 

它運作良好,但問題是我想提出的p:<prize>作爲任選,我應該使用哪種表情?

我也想結束拍攝時,有一個白色的空間

例子:

我想要什麼:

duration:1h 5m 1s title:Title test [p:prize]<-optionnal group

我想有prize組爲可選

如同當前表達式:

duration:1h 5m 1s title:Title test p:Something random

組的結果:

  • time1h 5m 1s

  • titleTitle test

  • prizeSomething random

+0

你有沒有嘗試在你的正則表達式的末尾添加一個'?'在結束括號之前? – Thijs

+0

組'時間':'1小時5分1秒' 組'標題':\t'標題測試p:ee'我已經dit了,獎品組被標記爲 –

+0

只需添加'?'將不起作用。試試類似[this](https://regex101.com/r/T3B9o0/2)。或者甚至可能[像這樣](https://regex101.com/r/lmOKvH/1)。 –

回答

0

你需要限制你的模式有點擺脫.*會吃光了後續的子模式的最後出現。然後,使用延遲點模式(.*?),只要需要將值匹配到下一個鍵,並在末尾添加$(字符串末尾)錨點以確保您將獲得所有帶有惰性點的文本。

d(?:uration)?:(?<time>.*?)\s*t(?:itle)?:(?<title>.*?)\s*(?:p(?:rize)?:(?<prize>.*))?$ 

查看regex pattern

詳細

  • d(?:uration)?: - 一個d:duration:
  • (?<time>.*?) - 集團 「時間」:任何零個或多個字符,儘可能少,到隨後的子模式
  • 的最左邊的發生
  • \s* - 0+空格
  • t(?:itle)?: - 或者title:t:
  • (?<title>.*?) - 組「標題」:任何零個或多個字符,儘可能少
  • \s* - 0+空格
  • (?: - 匹配的1點或0的出現的一個可選的非捕獲組的開始:
    • p(?:rize)?: - p:prize:
    • (?<prize>.*) - 集團 「獎」:任何零個或多個字符,儘可能少
  • )? - 可選組的末尾
  • $ - 字符串結尾。