2

社内マークアップ言語用のコード検証システムを開発しようとしていますが、正規表現の経験がないために少し問題があります。言語のタグは次の形式に従います。

{ タグ : 番号 : フレーズ 1 | フレーズ 2 ... | フレーズn}

ここで、number は範囲 (3.0、3.5、4.0 ... 8.5) の数値であり、フレーズの 1 つだけが最後にアスタリスクを持っている必要があり、少なくとも 2 つのフレーズが存在する必要があります。タグでは大文字と小文字が区別されず、空白は問題にならないことに注意してください。

私が使用している正規表現は次のとおりです。

\{ ?(mw) ?: ?[3-8]{1}(.0|.5)? ?((((\| ?(\w ?)+[\p{P}]? ?)*)+((\| ?(\w\ ?)+[\p{P}]?)* ?\* ?)+((\| ?(\w ?)+[\p{P}]? ?)*)?)|(((\| ?(\w ?)+[\p{P}]? ?)*)?((\| ?(\w ?)+[\p{P}]?)* ?\* ?)+((\| ?(\w ?)+[\p{P}]? ?)*)+))( ?\})

これは、次の正しいケースに一致します。

{ mw : 3.5 | phrase 1 | phrase 2* | phrase 3}

だけでなく、次の誤ったケースも含まれます。

{ mw : 3.5 | phrase 1* | phrase 2* | phrase 3} [Two asterisks]

{ mw : 3.5* | phrase 1 | phrase 2* | phrase 3} [An asterisk with the number value]

助けてくれてありがとう。

また、データ検証システムが通常どのように機能するかについて洞察を提供したい人がいれば、その洞察をいただければ幸いです。

4

2 に答える 2

1

これは、適切な文法と、yacc、antlr... ect などの解析ツールを使用して、実際に解析を行うコードを作成するための場所のように見えます。正規表現でできることは限られていますが、DSL の定義が不正確なようです。

または、単一の式を使用して見つけることができない特殊なケースを検証するために、複数の正規表現を使用する必要があります。

于 2012-07-09T14:29:28.460 に答える
0

ここ:

\{\s*(\w+)\s*:\s*([3-8]\.[05])\s*(\|[^|*\n]*)*(\|[^|*\n]*\*\s*)(\|[^|*\n]*)*\}

これは demoで、次の入力でテストされています:

{ mw : 3.5  | hello,  world  | says  | i  }
{ mw : 3.5  | hello,* world  | says  | i  }
{ mw : 3.5  | hello,  world* | says  | i  }
{ mw : 3.5  | hello,  world  | says* | i  }
{ mw : 3.5  | hello,  world  | says  | i* }
{ mw : 3.5    }
{ mw : 3.5  | }
{ mw : 3.5* | }
{ mw : 3.5  | hello, world  }
{ mw : 3.5  | hello, world* }

アップデート

いくつかのメモ。

  1. 元の正規表現で ?は、「0 または 1 個の空白文字」と言います。\s*「0個以上の空白文字」を意味している可能性があります。
  2. (.0|.5)元の正規表現では、実際には と が一致A0することに注意してくださいB5
  3. で行っていたものを再組み込むには、正規表現を変更する必要がある場合があります[\p{P}]?
  4. あなたは正しい道を進んでいるように見えますが、いくつかのことを複雑にしすぎている可能性があり、おそらく空白表現のファンキーなものが正規表現を台無しにしました。上記でリンクしたツールregexpal.comを使用して、正規表現を少しずつテストして、期待どおりに機能していない場所を確認することをお勧めします。

更新 2

フラグを追加できるかどうかは非常に疑わしいですが、xフラグを使用すると、この正規表現が大幅に短縮されます。

\{(\w+):([3-8]\.[05])(\|[^|*\n]*)*(\|[^|*\n]*\*)(\|[^|*\n]*)*\}
于 2012-07-09T14:39:34.677 に答える