2017-08-28 8 views
1

文字の前に名前付きパラメータをサポートするXregexp式を探しています。ここに私の式は次のとおりです。Xregexp javascriptオプションの名前付きグループを空白で区切る

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

それがうまく機能しているが、問題は、私のwannaは私が表現を使用する必要があり、オプションとして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

グループ 'time':' 1h 5m 1s' グループ 'title':\t'タイトルテストp:ee'私は既にそれを入れて、タイトルグループの中に賞金グループを入れます –

+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:またはのいずれか
  • (?<title>.*?) - グループ「タイトル」:任意のゼロ個以上の文字、
  • \s*できるだけ少ないよう - 0+空白
  • (?: - の1又は0の出現と一致する任意の非捕捉グループの開始:
    • p(?:rize)?:からp:またはprize:
    • (?<prize>.*) - グループ "賞":任意のゼロ個以上の文字、できるだけ少ないよう
  • )? - オプショングループの末尾
  • $ - 文字列の末尾。
関連する問題