【问题标题】:Regular expression to extract operands and operators along with parenthesis from a logical expression用于从逻辑表达式中提取操作数和运算符以及括号的正则表达式
【发布时间】:2015-03-13 18:52:43
【问题描述】:
ABC or DEF and ( GHI or JKL)

这里,操作数 ABC 可以是一个可能包含空格的短语。唯一的运算符是andor。谁能建议一种获取所有操作数的方法?

我想这样做: 将有一个运算符列表,我将使用它作为参考来查找此\bOPERATOR\b 中的任何一个的第一个索引,然后找到下一个可用\bOPERATOR\b 的第一个索引,并在这两个运算符之间提取一个单词(通过操作索引取决于找到算子的长度)

我觉得这是蛮力的做法。任何人都可以提出更好的解决方案吗?如果可以使用 jQuery 来完成,我更愿意。

【问题讨论】:

  • 有点难以理解你的意思是什么运算符,你能把每个运算符都用反引号括起来以提高可读性吗?
  • 我必须从那个表达式中获取 ABC、DEF、GHI 和 JKL
  • The only operators are and, or 括号呢?
  • 为了避免混淆,我删除了这些。

标签: jquery regex expression string-matching string-parsing


【解决方案1】:
var expression = "ABC or DEF and ( GHI or JKL)";
var tokens = expression.split(/ and | or |\(|\)/);
tokens = tokens.filter(function(token) { return token.trim().length > 0; });

解释:

正则表达式通过以下方式拆分表达式: 1) 用空格包围的“and”或“or”(以将这些运算符与单词的一部分区分开来,例如“stand”或“fork”)。 2) 打开和关闭括号。

filter 的调用会删除无关的空字符串和仅包含空格的字符串,如果连续出现多个分隔符(例如在您的示例中“and”后跟带括号的子表达式时),就会产生这种情况。

【讨论】:

  • expression.split(/ and | or |(|)/);我想不起作用..但我尝试了下面提到的解决方案
  • 括号前需要反斜杠,否则在正则表达式中有特殊含义。
  • 如果您也想返回运营商,解决方案是什么??
  • expression.split(/\s+/) 会将字符串分解为所有非空格组件。但是,在您的 OP 中,您说过操作数可以包含空格,并且此代码会将此类操作数分解为多个部分。
【解决方案2】:
var separators = ["\\bAND\\b" , "\\b(\\b", "\\bOR\\b", "\\b)\\b"];
var operands = expression.split(new RegExp(separators.join('|')));

【讨论】:

  • 这应该也可以,但是您仍然需要过滤掉空字符串和全空格字符串。
  • @phari 如果括号是操作数的一部分,您不想在括号上拆分怎么办?例如:A OR BC(D)。这里的拆分应该返回 1. A 2. OR 3. BC(D)
猜你喜欢
  • 1970-01-01
  • 2023-01-23
  • 2014-07-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多