2

次のような文字列に一致させる必要があります。

'if Country equals "United States" then Show'

SitecoreのWebformsforMarketersモジュールを使用しています。Sitecoreは.NETベースのCMSです。マーケターモジュールのWebフォームは、開発者以外のユーザーがテキストボックス、ドロップダウンリスト、チェックボックスなどを使用してフォームをデザインするためのGUIを提供するモジュールです。ユーザーが特定のフィールドを選択した場合にのみフォームの特定のフィールドを表示する必要があります。前のフィールドのオプション。例:ユーザーが[国]ドロップダウンリストから[米国]を選択した場合にのみ、[州]ドロップダウンリストを表示します。問題は、WFFMモジュールがフィールドの条件付きレンダリングをサポートしていないため、JavaScriptを使用して自分で実装しようとしていることです。私の考えはこれです:

  • 可能なすべてのフィールドを使用して、モジュール内のフォームを作成します
  • ページが読み込まれると、JavaScriptを使用して、前のフィールドの値に依存するフィールドを非表示にします
  • ユーザーがフィールドを操作するとき、JavaScriptを実行してフィールドの値を確認し、ページの読み込み時に非表示にした1つ以上のフィールドを表示する必要があるかどうかを判断します。

私は基本的にifステートメントのインタプリタを書いています。私はマーケターにフォームを「プログラム」する方法を提供しています。 Country私のページのドロップダウンリストの名前です。 equals条件です。 "United States"ドロップダウンリストの値の1つです。ユーザーがUnited Statesドロップダウンを選択すると、[状態then Show]ドロップダウンリストが表示されます。

したがって、正規表現テストの入力は常に次の形式に従います。

  • 常にキーワードで始まるif
  • 1つ以上の空白が続く
  • 任意の数の数字、および/または文字および/または空白が続く
    • コントロールの名前には、スペースと偶数を含む複数の単語を含めることができます
      • 例:名、または、住所行1
  • 1つ以上の空白が続く
  • キーワードが続くequals
  • 1つ以上の空白が続く
  • 1つの二重引用符が続きます
  • 任意の数の数字、および/または文字および/または空白が続く
    • コントロールの値には、スペースと偶数を含む複数の単語を含めることができます
  • 1つの二重引用符が続きます
  • 1つ以上の空白が続く
  • キーワードが続くthen
  • Showキーワードまたはキーワードのいずれかが続くHide

私はこれだけうまくいくものを持っていますが、それは私が上にリストした要件のすべてではありません。この行は、コントロール名の後の空白までずっと一致します。

var pattern = /^if\s+(\d*|\w*)\s+.*$/;

しかし、二重引用符で一致させようとすると、機能しません。二重引用符で照合するための構文はよくわかりません。私は次のすべてを試しましたが、うまくいきませんでした:

var pattern = /^if\s+(\d*|\w*)\s+["].*$/;

var pattern = /^if\s+(\d*|\w*)\s+\".*$/;

var pattern = /^if\s+(\d*|\w*)\s+\"{1}.*$/;

あなたが提供できるどんな助けも大いに感謝されるでしょう!

4

2 に答える 2

1

次のような表現をお勧めします。

/^if\s+([\w\s]+)\s+equals\s+"([\w\s]*)"\s+then\s+(\w*)$/

あなたはこのように使うことができます:

var expression = // set this to your input
var matches = expression.match(/^if\s+([\w\s]+)\s+equals\s+"([\w\s]*)"\s+then\s+(\w*)$/);

if (matches) { // if matches isn't null
    // matches[1] is the field name
    // matches[2] is the value in quotes
    // matches[3] is the operation to perform

「Hide」と「Show」を正規表現にハードコーディングしていません。代わりに、「then」の後にある文字列を返します。後で操作を追加するのが簡単になると思いました。これらの操作名をハードコーディングする場合は、final(\w*)をに変更するだけ(Hide|Show)です。また、この式は、引用符で囲まれた部分が空の文字列である場合にも機能します。これは、一部のフィールド値で有効な場合があります。

デモ: http: //jsfiddle.net/2UFHN/1/

注:あなたは_「任意の数の数字、および/または文字および/または空白」と言いました-そのために必要なのは[\w\s]+。あなたの表現には(\d*|\w*)\s+、「0個以上の数字または0個以上の単語文字の後に1つ以上のスペースが続く」という意味があります。\ wはすでに数字(およびazとアンダースコア)と一致しているため、\dも必要ありません。

大文字と小文字を区別しないようにするために、式にフラグを追加することをお勧めします。i/expressionhere/i

于 2012-08-25T04:05:19.130 に答える
0

「;」を使用するだけで、エスケープする必要はありません。

また、最初にを一致させずに「」を一致させようとしているようです。equalsそのため、どのテストケースとも一致しません。

/^if\s+(\d*|\w*)\s+".*$/.test("if abc \"xyz\"") // ==> true
/^if\s+(\d*|\w*)\s+".*$/.test("if abc equals \"xyz\"") // ==> false
于 2012-08-25T03:30:19.633 に答える