如何在某个字符之前和之后应用正则表达式

时间:2018-08-27 18:11:44

标签: javascript regex parentheses

我想将正则表达式代码应用于特定字符之前和/或之后的字符串部分,并且该字符必须在括号之外。

更具体地说,我正在编码一个网站(在React.JS中)以显示逻辑计算,并且我想删除主要逻辑运算符之前和之后的第一个和最后一个括号。 例如,在字符串中:

"((p∧r)∧(q∧r))∧(p∧q)"

我只想得到"(p∧r)∧(q∧r)""p∧q"

这意味着我想获取所有括号之外唯一的"∧"之前和之后的所有字符,并且我想删除两个字符串的第一个开头括号和最后一个结尾括号。 (例如,结果可能是一个数组,其中包含之前和之后的部分。) 我已经可以使用以下代码删除第一个父母:

str.replace(/(\()(.*)(\))/, "$2");

但是该代码现在已应用于整个字符串。

那么,如何在唯一的"∧"外部括号之前和之后的两个部分中应用此代码?如果可能的话,我只希望使用regexp中的代码,但是JavaScript部分可以。预先感谢。

2 个答案:

答案 0 :(得分:1)

您将无法在纯正则表达式中执行此操作,这类似于尝试使用正则表达式解析HTML。简而言之,这是不可能的(并且已经在in all possible way上得到了很多次回答)

因此您将需要JavaScript。在javascript中做到这一点并不容易,因为您需要解析整个字符串以查找“ ^ -who-are-not-in-parenthese”。

我首先要检查是否存在一些用于数学运算的解析器或其他解析器,这些解析器已经存在并且可以满足您的需求。

如果找不到任何东西,则需要创建自己。

您可以通过一个接一个字符地传递一个循环,使用一个用于括号的缩进级别的计数器以及一个类似树的数据结构作为输出来实现。

您还可以使用正则表达式查找缩进的最后一层并创建一个自底向上的解析器。您会找到所有最里面的括号组,将其保存,然后将其替换为特殊的标识符字符。然后您可以重做该操作以找到当前最里面的括号组,检查其中是否有特殊字符并将其放置在树中(作为该字符所标识元素的父级)。

一旦有了树结构(以一种或另一种方式),元素的根和第一级就应该是您想要的。

答案 1 :(得分:1)

您可以这样操作:

// your string
const fixMe = "((p∧r)∧(q∧r))^(p∧q)";

// Separate double paren items from single paren items
const parts = fixMe.match(/\(\(.*\)\)|\(.*\)/g).map(
  // Get rid of leading and following parens
  item => item.replace(/^\(|\)$/g, '')
);

但是,请注意:此解决方案不是很灵活。最好进行某种递归括号查找,其中每个循环都保留嵌套级别等信息。