有条件的效果图与JavaScript的正则表达式(Conditional Renderings wi

2019-06-27 09:14发布

我需要匹配一个字符串,如这样的:

'if Country equals "United States" then Show'

我与Web表单在Sitecore的营销模块的工作。 Sitecore的是基于CMS一个.NET。 对于营销模块的Web表单是提供了一个图形用户界面的非开发人员使用文本框设计表单,下拉列表,复选框等模块...我有要求,只显示在表单上的某些字段,如果用户选择了一个特定的选项前场。 例如:只显示当用户从国家下拉列表中挑选“美国”国家下拉列表中。 问题是,在WFFM模块不支持领域的条件渲染所以我想用JavaScript来实现它自己。 我的想法是这样的:

  • 我会在模块中打造出来的形式与所有可能的领域
  • 页面加载时,我将使用JavaScript来隐藏依赖于以前的字段的值字段
  • 当用户与磁场相互作用,我会运行一些JavaScript代码来检查该字段的值,并确定我是否应该显示我在页面加载隐藏字段的一个或多个。

我基本上编写解释为if声明; 我给营销人员的方式来“方案”的形式。 Country是我的网页上一个下拉列表的名称。 equals是一个条件。 "United States"是在下拉列表中的一个值。 如果用户挑选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}.*$/;

您可以提供任何帮助将不胜感激!

Answer 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

我没有硬编码“隐藏”和“显示”为正则表达式 - 而返回的任何字符串是经过“然后”。 我想这将使它更容易在以后添加更多的操作。 如果你想硬编码这些操作名称只是改变了最终的(\w*)(Hide|Show) 。 另外这个表达式将工作,如果在引号部分为空字符串,这可能是有效的某些字段值。

演示: http://jsfiddle.net/2UFHN/1/

注意:您说_“任意数量的数字和/或字母和/或白色空间” -对于你只需要[\w\s]+ 。 在你的表情,你有(\d*|\w*)\s+ ,这意味着“零个或多个数字或通过一个或多个空格BY FOLLOWED零个或多个单词字符”。 \ W总是匹配数字(以及亚利桑那州和下划线),所以你不需要\ d为好。

可能要添加一个i的标志,以你的表达,如/expressionhere/i让它情况钝感。



Answer 2:

只要使用“;没有必要逃避它。

此外,你显然是想匹配“不首先匹配的equals ,所以它不会匹配任何的测试用例。

/^if\s+(\d*|\w*)\s+".*$/.test("if abc \"xyz\"") // ==> true
/^if\s+(\d*|\w*)\s+".*$/.test("if abc equals \"xyz\"") // ==> false


文章来源: Conditional Renderings with JavaScript Regex