首页 > 解决方案 > 否定 RegEx Javascript 中的一对字符

问题描述

目前必须/([^\s\+\(]+)\^([^\s\,\+\)]+)/g转换x^ypow(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)被搞砸,但是我真正想做的是*(作为一对否定,所以只有在括号前面时括号才会被否定。

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

标签: javascriptregexp5.js

解决方案


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

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

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

演示

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

  • (捕获组 1
  • (\w+\([^\s+()]+\)捕获如下函数abs(-4)
    • \w+寻找一个或多个字母数字字母 ( [a-zA-Z0-9_])
    • ( 后面是一个文字左括号
    • [^\s+()]+然后,内容:不是空白的所有内容或()
    • \)和一个右括号。
  • |交替
  • [^\s+()]+常规参数
  • )收盘 $1

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


推荐阅读