我需要匹配这样的字符串:

'if Country equals "United States" then Show'

我正在使用Sitecore中的“营销人员Webforms”模块。 Sitecore是基于.NET的CMS。 Webforms for Marketers Modules是一个模块,为非开发人员提供GUI来设计带有文本框,下拉列表,复选框等的表单。我要求仅在用户选择特定表单时在表单上显示特定字段前一个字段中的选项。例如:仅当用户从“国家/地区”下拉列表中选择“美国”时,才显示“国家/地区”下拉列表。问题是,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}.*$/;

您能提供的任何帮助将不胜感激!

最佳答案

我建议这样的表达:

/^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+,表示“零个或多个数字或零个或多个单词字符,后跟一个或多个空格”。 \ w已经匹配数字(以及-z和下划线),因此您也不需要\ d。

您可能想在表达式中添加i标志,如/expressionhere/i使其不区分大小写。

关于javascript - 使用JavaScript正则表达式进行条件渲染,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12118921/

10-12 07:27