反应计算器,不确定如何改进正则表达式



我需要改进以下正则表达式以添加两个条件:它不应该允许"00"(或任何数量的前导零(,也不应该允许"1..."(整数后只有一个小数(。例如,用户可以单击"0"两次,但只允许一个"0"。运算符也是如此:用户可以单击"+-"(或其任意组合(,但只允许"-"。与".."等相同。这不应该适用于数字(可以允许1233388479223(。

this.setState(prevState => ({
value: `${prevState.value}${result}`.replace(/([/+-/*=])([/+-*=])/gi, '$2')
}))

计算器代码

class Calculator extends Component {
constructor(props) {
super(props);
this.state = {value:""}
this.handleClick = this.handleClick.bind(this);
}
handleClick(evt){
const id=evt.target.id;
const result= evt.target.value;
this.setState(prevState => ({
value: `${prevState.value}${result}`.replace(/([/+-/*=])([/+-*=])/gi, '$2')
}));
if(id==="equals"){
this.setState({value: math.eval(this.state.value)})
}
else if(id==="clear"){
this.setState({value : 0})  
}
}

render() {
return(
<div id="container">
<Display value={this.state.value} />
<Button onClick={this.handleClick} id="zero" value={'0'} />
<Button onClick={this.handleClick} id="one" value={'1'} />
<Button onClick={this.handleClick} id="two" value={'2'}/>
<Button onClick={this.handleClick} id="three" value={'3'} />
<Button onClick={this.handleClick} id="four" value={'4'} />
<Button onClick={this.handleClick} id="five" value={'5'} />
<Button onClick={this.handleClick} id="six" value={'6'} />
<Button onClick={this.handleClick} id="seven" value={'7'} />
<Button onClick={this.handleClick} id="eight" value={'8'}  />
<Button onClick={this.handleClick} id="nine" value={'9'} />
<Button onClick={this.handleClick} id="decimal" value={'.'} />
<Button onClick={this.handleClick} id="equals" value={'='} />
<Button onClick={this.handleClick} id="clear" value={'clear'}  />
<Button onClick={this.handleClick} id="add" value={'+'} />
<Button onClick={this.handleClick} id="subtract" value={'-'} />
<Button onClick={this.handleClick} id="multiply" value={'*'} />
<Button onClick={this.handleClick} id="divide" value={'/'} />
</div>
)
}

您将需要多个正则表达式来执行所需的操作。您可以一一调用它们。

首先,您的正则表达式中有一个错误,您没有转义减号字符(表示字符范围(,它应该是:

/([/+-/*=])([/+-*=])/g

删除前导零(如果后跟数字(:

/^0+(?=[1-9])/

替换为empty string


删除除一个前导zero之外的所有前导,后跟一个dot

/^0+(?=.)/

替换为零'0'


删除多个点:

/.+/g

替换为dot

您应该一一调用替换。 希望这对你有帮助。

最新更新