2017-04-22 2 views
1

私は、ダイスロール要求のさまざまなセクションをテキストボックスから文字列の形で取り込むことができるjavascriptダイスローリングシステムを構築しようとしています。そここのために必要ないくつかの重要な部品があり、彼らは怒鳴るリストである:D10またはD2またはD1203とない:ダイスローリングシステム用のREGEXとjavascriptを使用したキャプチャ

  • まず要求されたサイコロは、任意の整数などの長さが続く文字dまたはDが含まれている必要がありますq1
  • 第2に、このロールの任意の数を要求できます。たとえば、10D2または20D2ですが、Dまたはdの前の数は必要ありません。
  • 第三に、この数は、例えば、異なる数でマイナスまたは回、この番号を追加することによってで変更することができます:D10 + 10またはD10 * 20
  • をまた、あなたはD10 + D2
  • のような1つの他のサイコロのロールによって、この番号を変更します
  • また、要求された数字を使用してダイスロールを修正することもできます。例:D10 +(Strength)
  • 最後の3つのポイントは、必要に応じて無限回実行できます何らかの理由で1D10 * 10 + 2

これは私が大していないので可能かどうかわからない正規表現でやって来る私はいくつかの進歩を遂げましたが、私は最後のビットでロードブロックを打っています。 実際に計算を行う必要はありません。すべてをグループに分割し、文字列がルールと一致することを検証するだけです。 これは私がこれまで持っているものです。

/([\d]*?)([dD][\d]*)(([\+\-\*])[\d]|([\+\-\*])\(([a-zA-Z]*)\))?/gmi 

EDIT: は@sln

によりを求めたとして、私は、文字列などで仕事ができる正規表現を作ることができる何かを探しています必要なものを書き換えますこの:

10D6([+-*/](number|\(userInput\)|D6)) 

ので、ユーザは10個のD6サイコロを振り、事前定義された数のユーザー入力やサイコロのロールのいずれかを追加するためにそれらを求めることができます。しかし、10は必須ではなく、どちらもD6の後ろのものではありませんが、D6の後のすべてに1つの数学記号とその後の3つの記号が必要です。 D6の後のグループは、無限の回数行うことができます。 D6はあなたが好きなだけの任意の量にすることができます

最後に私はそれが動作するために必要な別の文字列のリストを持っているregex101を作成しました。 https://regex101.com/r/VJdgmw/2

+0

あなたの正規表現をもっと見るといいですね。しかし、あなたの記述にはそれほど曖昧さがあるので、それに関連するものは何もありません。成功する正規表現の鍵は、要件の厳密な定義です。すべてのパーツで説明を_oneエンティティとして書き直してください。あなたがコマンドラインオプションを説明していたのと同じように、すべてのオプションを 'D5 [[+/* 10 |(user)]、[+ D5]]と括弧で囲みます。 – sln

+0

@sln私はあなたの能力のうち最高のところで尋ねたことをやってみましたが、それが助けになるかどうかわかりません。 –

+0

よろしくお願いします。 – sln

答えて

2

[OK]を私は理解してそれを間引いた。
JS demo

/(\d*)(D\d*)((?:[+*-](?:\d+|\([A-Z]*\)))*)(?:\+(D\d*))?/i

Formatted/

(\d*)      # (1) 
(D \d*)      # (2), Dice 1, required 
(       # (3 start), modifiers 
     (?:       # Cluster 
      [+*-]       # + or - or * 
      (?: \d+ | \([A-Z]* \))  # either digits, or (name) 
    )*       # End cluster, 0 to many times 
)        # (3 end) 
(?: 
     \+       # + 
     (D \d*)      # (4), Dice 2, optional 
)? 

に説明中央部(?:[+*-](?:\d+|\([A-Z]*\)))*を繰り返すので、
個々に捕捉することができません。
しかし、コンテンツ全体をさらに処理したい場合は、中間部分全体がグループ3に取り込まれます。

+1

ありがとう、これは完璧で、ちょうど私が必要なものです。 –

+0

あなたは大歓迎です。 – sln

関連する問題