Regex/Javascript,将绝对值为| x |的字符串转换为abs(x)

Regex/Javascript,将绝对值为| x |的字符串转换为abs(x),javascript,regex,string-conversion,absolute-value,Javascript,Regex,String Conversion,Absolute Value,我正在尝试使用Javascript中的正则表达式转换一些包含绝对值的数学相关字符串。 我想将所有出现的|foo转换为abs(foo) 如果角色也可以嵌套,如何检测角色是否正在打开或关闭? 基本上,我想将所有出现的打开转换为abs(),所有关闭转换为)。垂直条之间的内容不变 可能输入和期望输出的一些示例: x+12abs(x)+12 |x |+12+| x+2 |abs(x)+12+abs(x+2) |x |+|x+| z |abs(x)+abs(x+abs(z)) 有什么想法吗?有些regex方

我正在尝试使用Javascript中的正则表达式转换一些包含绝对值的数学相关字符串。 我想将所有出现的
|foo
转换为
abs(foo)

如果角色也可以嵌套,如何检测角色是否正在打开或关闭? 基本上,我想将所有出现的打开
转换为
abs(
),所有关闭
转换为
。垂直条之间的内容不变

可能输入和期望输出的一些示例:
x+12

abs(x)+12


|x |+12+| x+2 |

abs(x)+12+abs(x+2)


|x |+|x+| z |

abs(x)+abs(x+abs(z))



有什么想法吗?

有些regex方言支持嵌套,JavaScript不在其中。但是,您可以分步骤执行此操作:

  • 用嵌套级别(+1,-1,从左到右)标记
    |
    s
  • 根据标签从左到右,从最低级别到最高级别,识别同一级别的开始和结束
    |
  • 在输入不平衡的情况下,清理剩余的标签
  • 测试用例高达3个级别的功能代码(该代码适用于任何级别):

    函数fixAbs(str){
    常量startTag='{s%L%}}';
    const endTag='{e%L%}}';
    常量absRegex=/\{s(\d+)\}(.*)\{e\1\}/g;
    设水平=0;
    str=str
    .replace(//g',)//删除所有空格
    .替换(/(\\\\*)?(\w+)(\\\\*)?/g,函数(m,c1,c2,c3){
    //正则表达式将变量与所有前导和尾随的“|”匹配
    设s=c2;
    如果(c1){
    //在每个前导“|”中添加一个开始标记:{{s0}}、{{s1}}、。。。
    //及职位增长水平
    s='';
    for(设i=0;i{
    let result=fixAbs(str);
    console.log(“''+str+'”==>“'+result+'”);
    
    });有些正则表达式方言支持嵌套,JavaScript不在其中。但是,您可以分步骤执行此操作:

  • 用嵌套级别(+1,-1,从左到右)标记
    |
    s
  • 根据标签从左到右,从最低级别到最高级别,识别同一级别的开始和结束
    |
  • 在输入不平衡的情况下,清理剩余的标签
  • 测试用例高达3个级别的功能代码(该代码适用于任何级别):

    函数fixAbs(str){
    常量startTag='{s%L%}}';
    const endTag='{e%L%}}';
    常量absRegex=/\{s(\d+)\}(.*)\{e\1\}/g;
    设水平=0;
    str=str
    .replace(//g',)//删除所有空格
    .替换(/(\\\\*)?(\w+)(\\\\*)?/g,函数(m,c1,c2,c3){
    //正则表达式将变量与所有前导和尾随的“|”匹配
    设s=c2;
    如果(c1){
    //在每个前导“|”中添加一个开始标记:{{s0}}、{{s1}}、。。。
    //及职位增长水平
    s='';
    for(设i=0;i{
    let result=fixAbs(str);
    console.log(“''+str+'”==>“'+result+'”);
    
    });您正在查看的输入语言是非正则的,因此正则表达式无法(正确)解析它。尤其是嵌套方面似乎令人讨厌。您可以使用Regex构建一个lexer,但是您需要一个完整的解析器来输出它……有一些Regex方言支持嵌套,而不是JavaScript。但是,您可以通过以下几个步骤完成此操作:1。从左到右用嵌套级别(+1,-1)标记
    |
    s。2.从左到右识别相同级别的开始和结束
    |
    。3.清理标记的
    |
    。请参阅您正在查看的输入语言是非规则的,因此它不能(正确地)显示由正则表达式解析。特别是嵌套方面似乎令人讨厌。您可以使用正则表达式构建一个词法分析器,但您需要一个完整的解析器来进行输出…有一些正则表达式方言支持嵌套,而不是JavaScript。但是,您可以分几个步骤来完成此操作:1.用嵌套级别标记
    s(+1,-1,从左到右。2.从左到右确定同一级别的开始和结束
    。3.清理标记的
    。看到哇,非常好!感谢你花时间@PeterThoney。效果非常好,我确实找到了一个没有通过的案例,“| x |+12+| 2+x |”或“| x |+12+| x+2 |”.我会仔细看看函数的,可以吗