如果需要,使用 RegExp 在开头只得到一个“-”

Using RegExp to get just one "-" at the start if needed

提问人:Rewind 提问时间:10/9/2023 最后编辑:pilchardRewind 更新时间:10/10/2023 访问量:78

问:

我想要一个数字,最小值为 -1,并且开始时只输入一个负数。

这就是我目前所拥有的。-1 最小值不起作用。小数点后一点效果很好。单个负号效果很好。但是我不能强迫否定只出现在开始时。

如果需要,我怎样才能只在开始时得到否定? 我怎样才能让 -1 的最小值工作?

<input type="text" id="mynumber" min="-1"
        oninput="this.value = this.value.replace(/[^0-9.-]/g, '').replace(/(\..*)\./g, '$1').replace(/(\--*)\-/g, '$1');" /> 

javascript 正则表达式替换

评论

1赞 pilchard 10/9/2023
输入类型没有 min 属性,您的意思是使用输入吗?textnumber
0赞 Rewind 10/9/2023
我没有意识到“文本”没有最小标签。但是,如果我使用“数字”,那么输入就会变得很奇怪,不允许使用“-”,也不允许使用“.”。
1赞 pilchard 10/9/2023
如果你想继续使用你的多重替换模式,你可以添加另一个(在这种情况下表示字符串的开头,而不是否定).replace(/^(.+)-/g, '$1')^
0赞 Rewind 10/9/2023
多亏了@pilchard,这才奏效。有人知道如何使用替换概念获得最小 -1 吗?
1赞 Heretic Monkey 10/10/2023
请不要使用 HTML 属性将事件处理程序附加到元素;还有更多更好的方法,比如使用 .addEventListener

答:

1赞 The fourth bird 10/10/2023 #1

您可以对前 2 次调用使用 1 模式来替换:

[^0-9.\n-]+|^-(?:1\.0*[1-9]|[2-9]|1\d+).*|(?!^)-

该模式匹配:

  • [^0-9.\n-]匹配 1+ 字符未在字符类中列出
  • |
  • ^-0*在字符串的开头匹配,后跟可选的零-
  • (?:1\.0*[1-9]|[2-9]|1\d+)匹配可选的零和数字 1-9,或匹配数字 2-9 或匹配大于 10 的数字1.
  • .*匹配行的其余部分
  • |
  • (?!^)-在字符串的开头匹配 not-

观看正则表达式演示

保留最后一次调用以删除第二次出现的点。

function handleInput() {
  this.value = this.value.replace(/[^0-9.\n-]+|^-0*(?:1\.0*[1-9]|[2-9]|1\d+).*|(?!^)-/g, '').replace(/(\..*)\./g, '$1');
}

const inp = document.getElementById("mynumber");

if (inp) {
  inp.addEventListener("input", handleInput);
}
<input type="text" id="mynumber" />

如果 JavaScript 环境支持后视断言,则可以使用单个替换:

function handleInput() {
  this.value = this.value.replace(/[^0-9.\n-]+|^-0*(?:1\.0*[1-9]|[2-9]|1\d+).*|(?!^)-|(?<!^[^\n.]*)\./g, '');
}

const inp = document.getElementById("mynumber");

if (inp) {
  inp.addEventListener("input", handleInput);
}
<input type="text" id="mynumber" />

1赞 MikeB 10/10/2023 #2

按照你尝试的方式做事可能有充分的理由,但我会让 JS 为你做繁重的工作,比如:

let thisValue = document.getElementById("mynumber");
if( thisValue < -1){
    // Good
}else{
    // Bad - do something here
}

(我也会稍微充实一下,以涵盖非数字输入的可能性,但话又说回来,我一开始就不会使用“数字”输入类型!