2

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

'if Country equals "United States" then Show'

我正在使用 Sitecore 中的营销人员网络表单模块。Sitecore 是一个基于 .NET 的 CMS。营销人员模块的 Webforms 是一个模块,它为非开发人员提供 GUI 来设计带有文本框、下拉列表、复选框等的表单......前一个字段中的选项。例如:仅当用户从 Country 下拉列表中选择“United States”时才显示 States 下拉列表。问题是,WFFM 模块不支持字段的条件渲染,所以我尝试用 JavaScript 自己实现它。我的想法是这样的:

  • 我将使用所有可能的字段在模块中构建表单
  • 当页面加载时,我将使用 JavaScript 隐藏依赖于先前字段值的字段
  • 当用户与某个字段交互时,我将运行一些 JavaScript 来检查该字段的值并确定是否应该显示我在页面加载时隐藏的一个或多个字段。

我基本上是在为if声明编写解释器;我正在为营销人员提供一种“编程”表单的方法。 Country是我页面上下拉列表的名称。 equals是一个条件。 "United States"是下拉列表中的值之一。如果用户United States在下拉列表中选择,then ShowStates 下拉列表。

因此,正则表达式测试的输入将始终遵循以下格式:

  • 总是以关键字开头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

我没有将“隐藏”和“显示”硬编码到正则表达式中——而是返回“then”之后的任何字符串。我认为这将使以后添加更多操作变得更加容易。如果您想对这些操作名称进行硬编码,只需将最终名称更改(\w*)(Hide|Show). 如果引号中的部分是空字符串,此表达式也将起作用,这可能对某些字段值有效。

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

注意:您说 _“任意数量的数字,和/或字母和/或空格” - 为此您只需要[\w\s]+. 在您的表达式中,您有(\d*|\w*)\s+,这意味着“零个或多个数字或零个或多个单词字符后跟一个或多个空格”。\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 回答