需要一个正则表达式来强制 $ 或 % 但不能同时强制两者

Need a Regex to force either $ or % but not both

目前,我在 Angular 9 应用程序内的 HTML 页面上定义了以下输入:

<input type="text" formControlName="amountToWithholdInput"
       onkeyup="this.value = this.value.replace(/[^0-9.%$]/, '');">

在用户键入时,它会自动删除除数字、$、% 或小数以外的所有字符。

我该如何修改它,以便在他们已经输入 $ 时删除 %,反之亦然(如果他们已经输入 %,则删除 $)?换句话说,它需要检查并查看特定字符是否存在,然后在他们尝试输入该字符时删除“相反”字符。

还是我做错了?还有其他我没有想到的方法吗?

本质上,您是在要求您的用户插入一个带有可选小数部分和尾随 $% 符号的数值,其他所有内容都应在按键输入时删除。

因此,我们可以使用匹配任何字符串的正则表达式,但将小数和单个符号保留在可选组中,然后仅用该组替换原始字符串 </code>,而其余部分在完整匹配被丢弃。试一试:</p> <p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code"> <pre><code><input type="text" formControlName="amountToWithholdInput" onkeyup="this.value = this.value.replace(/^((?:[0-9]+\.?[0-9]*)[%$]?)?.*/, '')">

为了完成这项工作,我们需要确保内部正则表达式也可以匹配最终字符串的不完整版本,即数字、点和符号部分也需要设为可选。如果您需要更具体的(例如,只有两个小数)或不同的顺序(例如,美元符号在前,百分比在后),我们可以轻松调整内部正则表达式,但可以应用相同的概念,即

<input type="text" formControlName="amountToWithholdInput" 
    onkeyup="this.value = this.value.replace(/((?:[0-9]*\.?[0-9]{0,2}[%]?)|(?:[$]?[0-9]*\.?[0-9]{0,2}))?.*/, '')">

在这里,sub-patterns 的顺序变得很重要,因为我们只想匹配一个符号并且只匹配特定位置。