javascript - 使用 Regex 参考累积状态数组有条件地触发 redux react 应用程序中的操作
问题描述
我正在用 React-Redux 构建一个简单的计算器。这个想法是通过 eval() 来自输入的表达式字符串来计算结果。我想通过删除重复的“。”来防止用户为同一组数字输入多个小数(“。”)。通过“退格”。但是,经过数小时的尝试,我正在努力让它工作。以下是相关代码...
=== Actions
const setInput = val => {
return {
type: SET_INPUT,
input: val
};
};
const bkSpace = () => {
return {
type: BK_SPACE
};
};
=== Reducer
const CalReducer = ( state = defaultState, action) => {
switch (action.type) {
case SET_INPUT:
return {
...state,
input: action.input,
expression: [...state.expression.slice(0),
action.input.replace("×", "*").replace("÷", "/")]
.join("").replace(space, "")
};
case BK_SPACE:
return {
...state,
expression: [...state.expression.slice(0, state.expression.length-1)].join("")
};
default: return state;
};
};
=== React class component functions before render()
filter = (key) => {
const {setInput, bkSpace, expression} = this.props
switch (key) {
case ".":
setInput(key);
if (/REGEX/g.test(expression) || expression[expression.length-1] === ".") {
bkSpace();
bkSpace(); //maybe?
showMsg("You cannot contain two '.' in one numer.");
setTimeout(() => showMsg("0"), 1500);
break;
}
break;
default:
setInput(key);
break;
};
};
尝试了我能想到的所有方法,当数字之前存在另一个小数时,仍然无法避免小数,例如防止小数输入或在小数已经出现后立即“退格”运算符后面的一组数字。
123+1.12.
^prevent
12.3+112.1
^allow
123.3.
^prevent
...etc, like a normal calculator but prevent syntax error
通过使用正则表达式,当状态表达式通过累积输入而增长并且函数结果将变得一团糟时,我无法找到一种方法来正确包含(或排除)合格的数字组以执行所需的操作。(比如后退 1 个状态,允许在退格之前出现另一个小数,用户可以输入具有此状态间隙的其他数字以逃避限制并允许 123.1.12 之类的 /\d*[.]\d*[- + /]/ 或 /\d [.]\d[-+ /] / /\d*[.]\d*[-+ /]+|\d [.]\d*/ 等等。 t 允许在运算符后输入小数)感谢您的任何建议。
解决方案
通常,如果该行与此不匹配:
/^[-+/]*(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[-+/]+(?:\d+(?:\.\d*)?|\.\d+))*)?[-+/]*$/
然后它在运算符之间的段内有 2 个小数。
https://regex101.com/r/e52FVw/1
^
[-+/]*
(?:
(?:
\d+
(?: \. \d* )?
| \. \d+
)
(?:
[-+/]+
(?:
\d+
(?: \. \d* )?
| \. \d+
)
)*
)?
[-+/]*
$
推荐阅读
- php - Laravel download pdf returning random characters
- php - 具有多个提交按钮或多个表单的表单
- list - 在 Netlogo 中按元素对列表进行分组
- typescript - Redux 的 Reducer<> 类型没有正确地将返回类型传递给 reducer?
- node.js - 如何响应来自 Node.js 的文件(来自 AWS)
- c# - 使用 Span 将输入字符串中的 ID 解析为长数字
在.Net - python - 将 xaxis 原点向左移动到 yaxis 交叉点
- python - 为表单创建测试:当测试断言失败时如何查看表单的错误
- angular - @Input 类变量未填充可行的成员
- python - 使用 maketrans/translate 从包含字符串的系列中删除标点符号