利用正则式计算表达式的值

RT,最近又看了下JAVA的正则式,解决了之前对JAVA中正则式的一些疑问.
写了个利用正则式计算表达式值的代码.算法很简单,就是"先乘除,后加减,有括号先算括号里的"
ps:当然,计算表达式值最常用也最有效的方法是利用逆波兰式,这儿只是拿正则式来练练手.
程序没有经过严谨的测试,可能有bug.

java 代码
  1. import  java.util.regex.*;   
  2. import  java.util.*;   
  3. /**  
  4. *利用正则式计算表达式的值  
  5. *@author: Eastsun  
  6. *@version: 0.5 07.2.26  
  7. */   
  8. public   class  Calculate{   
  9.     /*
  10.     正则式这块贴上来会影响代码结构,略之.
  11.     详见打包后的代码
  12.     */        
  13.      private   static   double  operator(Matcher m, int  index){   
  14.         index =index* 2 ;   
  15.          double  a,b;   
  16.          if (m.group( 1 )!= null ){   
  17.             a =Double.parseDouble(m.group( 1 ));   
  18.             b =Double.parseDouble(m.group( 2 ));   
  19.         }   
  20.          else {   
  21.             index ++;   
  22.             a =Double.parseDouble(m.group( 3 ));   
  23.             b =Double.parseDouble(m.group( 4 ));   
  24.         }   
  25.          double  r = 0.0 ;   
  26.          switch (index){   
  27.              case   0 :   
  28.                 r =a+b;   
  29.                  break ;   
  30.              case   1 :   
  31.                 r =a-b;   
  32.                  break ;   
  33.              case   2 :   
  34.                 r =a*b;   
  35.                  break ;   
  36.              case   3 :   
  37.                 r =a/b;   
  38.                  break ;   
  39.         }   
  40.          return  r;   
  41.     }   
  42.      public   static   double  eval(String str){   
  43.         StringBuilder sb = new  StringBuilder(str.replaceAll( "\\s+" , "" ));   
  44.          while ( true ){   
  45.             Matcher m =BRA.matcher(sb);   
  46.              if (m.find()){   
  47.                 sb.replace(m.start(),m.end(),m.group( 1 ));   
  48.             }   
  49.              else {   
  50.                  int  index = 1 ;   
  51.                 m =MUL_OR_DIV.matcher(sb);   
  52.                  if (!m.find()){   
  53.                     index --;   
  54.                     m =ADD_OR_SUB.matcher(sb);   
  55.                      if (!m.find())  break ;   
  56.                 }   
  57.                 sb.replace(m.start(),m.end(), "" +operator(m,index));   
  58.             }   
  59.         }   
  60.          return  Double.parseDouble(sb.toString());   
  61.     }                               
  62.      public   static   void  main(String[] args){   
  63.         Scanner scan = new  Scanner(System.in);   
  64.          while ( true ){   
  65.             System.out.print( "\nEnter a expression :" );   
  66.             String str =scan.next();   
  67.              if (str.equals( "exit" ))  break ;   
  68.             System.out.print(str + " = " +eval(str));   
  69.         }   
  70.     }   
  71. }  

 

利用正则表达式处理四则运算 不久之前我写过一篇与或逻辑运算的实现及格式验证的文章,其中验证部分我使用了正则表达式,但计算部分还是依靠基本流程处理的。后来想了想,计算是否也能使用正则表达式呢?再做一个逻辑表达式计算就没太大意思了,这次咱来试试四则运算。   我的基本思路是先乘除后加减,先运算式子中简单的乘除法例如:“2*5”,但“2*(3+4)”不必处理先,咱们先解决简单的。然后处理简单的加减法,例如"3+4",同样涉及 阅读详情

相关推荐

算术表达式正则表达法实现

此为VC++6.0代码,当然你只要能看懂VC++代码的也可以下哦,本人在分析算术表达式时采用了S->VAL,VAL->(VAL),VAL->VAL OP VAL,VAL->OP VAL,而且还能计算X变量哦。。。。如 -32x+sinx-(x+9) 的值哦。。

利用正则表达式计算表达式的值

方法一:在网上看资料的时候,无意看到一道关于Java的题:原意应该是随意输入一个合法的表达式,怎样用Java编写一个程序计算此表达式的值,开始的时候觉得很简单,不就是+,-,*,/和括号吗?觉得应该很轻松就可以把此程序搞定,可是后来仔细一分析,总觉得如果自己解析,利用String提供的方法,似乎很难把"("解析出来,但是如果此表达式有很多很多括号呢?怎样用程序判断那些括号是一对?百思不

被遗弃的玩偶 927

保姆级教程:用海思PQTool搞定ISP图像调试,从参数读取到固件烧录全流程

本文提供海思PQTool的ISP图像调试全流程指南,从参数读取、实时调试到固件烧录,涵盖环境配置、核心功能解析、参数固化及生产部署。通过实战案例和避坑指南,帮助开发者高效提升图像质量,适用于海思开发板的ISP调试与优化。

weixin_30872337的博客 283

表达式求值

表达式求值的大致思想是将有运算符优先级顺序的算术表达式转换为无运算符优先级的后缀表达式,从而求出值。表达式分为三种; 1. 前缀表达式(波兰式): 前缀表达式是不含括号的算术表达式,它将运算符写在前面,操作数写在后面(如“3+4”的前缀表达式为“+34”)。 2. 中缀表达式: 可以包含括号,并且运算符处于操作数中间的算术表达式(“3+4”的中缀表达式仍为“3+4”),中缀表达式就是人们平时使用的算术表示方法。 3. 后缀表达式(逆波兰式): 不包含括号,运算符放在两个操作数后面的算术表达式(如“3+4”的

Nxin的小抄本 2237

【GPT】Coze使用开放平台接口-【7】Dify 比较篇

coze 用于社交,dify 用来内部构建。抛开工作流,机器人,工具,coze 最大的区别在于可以直接发布到社交媒体上。所以,coze 对操作体验上也花了不少功夫,而 dify 就专注在帮助使用者打磨工作流。coze 各个大模块之前可以联动的机制也比较多,所以侧重点各不相同。

非晓为骁的博客 7615

Linux 音频驱动(六) ALSA音频驱动之PCM Write数据传递过程

目录1. 前言2. PCM Data Flow3. 总结 1. 前言 本文,我们将以回放(Playback,播放音频)为例,讲解PCM Data是如何从用户空间到内核空间,最后传递到Codec。 在Linux 音频驱动(一) ASoC音频框架简介中,我们给出了回放(Playback)PCM数据流示意图: 对于Linux来说,由于分为 user space 和kernel space,而且两者之间不能随便互相访问。因此用户如果播放音频,则需要调用copy_from_user()将用户数据从user spa

_Modest_的博客 1万+

使用 正则表达式 验证四则运算表达式

Regex regex = new Regex(@"^           (?#匹配开头)/s*[-+]?         (?#开头可以出现正负号)(((([0-9]/,?[0-9]*)+/.?[0-9]*))+(/s*$|/s*([-+*/]+?|[( (  (?/()/s*       (?#左括号,保存到o名字下)  [-+]?        (?#可选正负号)  (((([0-9]/,

cqdyh的专栏 7284

Stata:手动安装ivreghdfe包的完整指南与常见问题解决

本文提供了Stata中手动安装ivreghdfe包的完整指南,包括准备工作、详细安装步骤及常见问题解决方案。ivreghdfe作为处理高维固定效应模型的强大工具,依赖ftools、reghdfe和ivreg2三个核心组件,手动安装可避免版本冲突问题。文章还分享了进阶使用技巧,如并行计算加速和保存固定效应估计值,助力用户高效完成工具变量回归分析。

weixin_29251131的博客 931

java表达式计算器_做了个Java表达式计算器

#re: 做了个Java表达式计算器2008-03-12 12:28lvq810import java.util.regex.*;import java.util.*;/***利用正则式计算表达式的值*@author: Eastsun*@version: 0.5 07.2.26*/public class Calculate{public static final String NUM_PATT...

weixin_42502040的博客 169

盘点军工行业软件研发的那些常用GJB标准

GJB5000、2786、438、141、102、8114等...

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 9481

易智联LM401模块学习(一)——初识Lora

Lora

weixin_46046597的博客 1056

什么是正则表达式

最近看了一篇关于正则表达式的学习笔记,觉得讲的非常好,更有图形化的神器相助,想不学会都难,所以想转给大家看看。 话说不是开发为啥要学正则表达式这种看似很晦涩的东西呢,因为现在很多搜索的场景都是支持正则表达式的,学会了正则表达式就有如一把利剑在手。 本文较长,建议抽40分钟完整的时间一次读完再慢慢消化。以下是正文(为了适应难度,做了稍许调整) 1.什么是正则表达式 正则表达式,又称正规表示式、正规表...

weixin_43343072的博客 1万+

微信小程序|基于小程序+云开发制作一个菜谱小程序

今天吃什么?这是一个让强迫症左右为难的问题,跟随此文基于小程序+云开发制作一个菜谱小程序,根据现有食材一键生成菜谱,省心又省力。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

使用正则表达式实现表达式计算器

使用正则表达式实现简易表达式计算器 Windows(.NET Framework 2.0) & Windows Mobile (.NET Compact Framework 2.0)

crapex的专栏 9320

开源工具对比:5款主流大数据脱敏框架评测

数据脱敏(Data Masking/Anonymization),也称为数据漂白、数据去标识化,是指在不影响数据可用性的前提下,通过一定的技术手段对敏感信息进行处理,使其无法被识别或关联到具体个人或实体的过程。当应用程序向数据库写入数据(INSERT/UPDATE)时,ShardingSphere 会拦截 SQL,对配置了脱敏规则的字段,使用指定的算法进行加密/脱敏处理,然后将处理后的数据写入到。如果你的答案是“是”,那么数据脱敏,尤其是针对海量数据的。好的,各位技术同仁,数据安全领域的探索者们,大家好。

小程序开发 1185

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

在Excel/WPS中计算带文字的计算式,实现计算式或工程量计算

有些工程计算的计算式,是包含文字说明的,若是简单的文字,可以通过Evaluate函数实现,具体实现方法,网上已经有很多说明了,我这里不再介绍。这里介绍如何通过自定义函数实现带文字计算式的计算功能。

qq_42296478的博客 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

shell脚本值之正则表达式之grep

一、正则表达式 1.1正则表达式的定义 正则表达式,又称规则表达式,(英语:Regular Expression)在代码中常简写为 regex、regexp 或 RE ,计算机科学的一个概念。 正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本 正则表达式不只有一种,而且 Linux 中不同的程序可能会使用不同的正则表达式,如: 工具:grep sed awk egrep 正则表达式——通常用于判断语句中,用来检查某一字符串是否满足某一格式 正则表达式是由普通字符与元字符组成 普通字符:包括大小写

weixin_67510296的博客 2485

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

正则表达式匹配所有内容_Python正则表达式

什么是正则表达式•正则表达式是字符串处理的有力工具,比字符串自身提供的方法提供了更强大的处理功能。•例如判断一个字符串是否是合法的Email地址,可以通过构造一个规则(正则表达式),去判断字符串是否能够匹配。正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。...

weixin_30781567的博客 1万+

Java实现计算表达式的值

需求 已知一个只含有()、+ 、-、*、\这五种操作符,数字只是整数,并且空格隔开的表达式字符串,求表达式的值。 例如: ( 3 + 4 ) * 5 - 6 结果为29 解题思路 给定表达式为中缀表达式,将其转为后缀表达式(逆波兰表达式)然后使用逆波兰表达式求解值。 逆波兰表达式求解值得思路: 遍历表达式,遇到数值则入栈,遇到计算符则从栈中弹出两个元素然后将计算结果压入栈中。做减和除法运算的时候...

Mr_Liuzhongbin的博客 4637

利用正则表达式求解多项式相乘问题

最近几天在学习正则表达式,然后想起来以前一些关于字符串解析的问题都可以利用正则表达式进行求解,而不必人工、机械的去自己一位位去解析目标字符串。比如经典的多项式相乘问题,我们来看一个问题的实例: http://acm.ecnu.edu.cn/problem/2821/计算两个一元多项式的乘积。 Input 每行两个多项式,以一个空格分隔,多项式格式为 anx^n+…+a1x+a0。 每行长度不

fawks96的专栏 2168

利用正则表达式反向选择数据

最近有朋友问如何在文件中选择不包含诸如1900、1901、……1999字符串的行,目标文件中所有数据都是由数字字符组成。如果使用 grep 这样的工具,只用写很一个非常简单的正则表达式就能解决问题:grep -v 19/d/d target_filegrep 的 -v 选项表示选择 target_file 中不匹配目标正则表达式的行。对于诸如 Java 或者 Ruby 这样的程序设计语

I SEE STARS 1万+

计算表达式的值

计算表达式的的值是栈的应用,比如我们求中缀表达式(A+B*(C-D)-E/F)的值, 1.首先需要将它去掉括号,转化为后缀表达式ABCD-*+EF/- 2.依次扫描后缀表达式的值,如果是数字入栈,遇到运算符则弹出两个数,和运算符运算后再入栈……最后栈顶就是结果 给出python代码如下: class LinkNode: def __init__(self,**kw): self.data=kw["data"] self.next=kw["next"] cla

qq_34153210的博客 1901

Gitleaks规则性能分析:正则表达式优化与熵值计算

在当今DevSecOps实践中,敏感信息泄露已成为企业安全的重大威胁。Gitleaks作为一款开源的秘密检测工具,通过正则表达式匹配和熵值计算双引擎,为代码仓库提供自动化的秘密扫描能力。本文深入剖析Gitleaks核心检测机制,揭示正则表达式优化与熵值计算的性能瓶颈,并提供经过实测验证的优化方案,帮助开发者在保证检测精度的前提下,将扫描效率提升40%以上。 ## Gitleaks规则引擎架构解析...

gitblog_00173的博客 483
上一篇: 一个将BIG5编码转换为GB2312编码的类
下一篇: 求1~N中1出现的次数的递归算法
JavaSxy
博客等级 码龄21年 1粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值