否定正则表达式中的一对字符 Javascript

Negate a pair of characters in RegEx Javascript

目前有 /([^\s\+\(]+)\^([^\s\,\+\)]+)/gx^y 转换为 pow(x,y)

适用于:

y = x 
y = x^2 
y = x^2 + y^2
y = 5*(x^2 + y^2)
y = (x^2 + y^2)
y = pow(x^2+y^2, 2)

但是我希望能够做这样的事情:

y = abs(x)^2 --> y = pow(abs(x), 2)

我目前在第一个否定捕获组中有 \( 以阻止 5*(x^2) 被搞砸,但是我真正想做的是将 *( 作为一对否定,所以括号只有在括号前面时才会被否定。

有没有办法否定连续字符的特定出现?

我们可以完全避免高级正则表达式功能,并为函数参数添加一个简单的替换:

(\w+\([^\s+()]+\)|[^\s+()]+)\^(\w+\([^\s+()]+\)|[^\s,+()]+)

实际上,这不应该只添加到第一个参数,因为第二个参数也可以是一个函数。

Demo

这里的基本思想是分别捕获函数和正则参数。

  • ( 捕获组 1
  • (\w+\([^\s+()]+\) 捕获类似 abs(-4) 的函数:
    • \w+ 寻找一个或多个字母数字字母 ([a-zA-Z0-9_])
    • ( 后跟一个文字左括号
    • [^\s+()]+ 那么,内容:非白的一切-space or ()
    • \) 和右括号。
  • |交替
  • [^\s+()]+ 常规参数
  • )收盘价$1

然后是 \^,然后是应用相同方法的第二个捕获组。