在特定条件下只接受数字和特定字符的正则表达式 javascript (Vue.js)

Regular expression that only accepts numbers and certain characters under certain conditions with javascript (Vue.js)

任何人都可以帮助我使用执行以下操作的正则表达式:

我希望有人能帮我解决这个问题,我自己并不擅长正则表达式,但我知道它们很强大。但是,如果有其他方法可用,请告诉我。 我已经通过不同的方法自己尝试过。不幸的是,我编写的代码无法正常工作,如下所示:

validateNumberInput() {
  this.countPeriods = 0
  this.countCommas = 0
  this.countE = 0
  for (var i = 0; i <= this.inputValue.length; i++) {
    if (
      isNaN(this.inputValue[i]) &&
      this.inputValue[i] &&
      this.inputValue[i] != "." &&
      this.inputValue[i] != "," &&
      this.inputValue[i].toUpperCase() != "E"
    ) {
      console.log(this.inputValue[i])
      console.log(this.inputValue.length)
      this.inputValue = this.inputValue.replace(this.inputValue[i], "")
    } else if (this.inputValue[i] == "." && this.countPeriods < 1) {
      this.countPeriods = this.countPeriods + 1
      this.countCommas = this.countCommas + 1
    } else if (this.inputValue[i] == "." && this.countPeriods >= 1) {
      this.inputValue = this.inputValue.replace(this.inputValue[i], "")
    } else if (this.inputValue[i] == ",") {
      this.countCommas = this.countCommas + 1
      this.countPeriods = this.countPeriods + 1
    } else if (this.inputValue[i] == "E" || this.inputValue[i] == "e") {
      this.countE = this.countE + 1
    }

    //  Only accept a period, comma or 'e' once
    if (this.inputValue[i] == "." && this.countPeriods > 1) {
      this.inputValue = this.inputValue.replace(this.inputValue[i], "")
    } else if (this.inputValue[i] == "," && this.countCommas > 1) {
      this.inputValue = this.inputValue.replace(this.inputValue[i], "")
    } else if ((this.inputValue[i] == "E" || this.inputValue[i] == "e") && this.countE > 1) {
      this.inputValue = this.inputValue.replace(this.inputValue[i], "")
    }
  }
},

我遇到的问题是,如果句点、逗号或 'e' 已经出现一次,并且我重新输入这些字符之一,该字符会在其原始位置消失并被新字符取代.应该是这样的,如果已经输入了这些字符之一,我就不能再输入这些字符了

用于验证字符串是否为数字或是否符合您的规则的正则表达式是 ^[0-9]*[.,]?[0-9]+([eE][0-9]+)?$。我在 https://www.regular-expressions.info/floatingpoint.html 找到了它。你可以在那里阅读它是如何工作的。我只替换了“.?”用 [.,]?, 因为你想匹配逗号或分号作为分形部分的分隔符。 我也遗漏了“[-+]?”无处不在,因为你不想匹配代数符号(在指数或整数前面)。

但是...

在您发布的代码中,您试图删除所有无效字符,这意味着将例如“a12a3.4x5.6e7E8”转换为“123.456e78”。 您也可以为此使用一个正则表达式,但它会非常复杂,以至于没有人会立即理解它。因此,为此我建议改用以下三个步骤:

var s = "1a2.3b4.5,6e78Ee.";
var result = s.replaceAll(/[^0-9.,e]/gi, ""); // delete all characters except numbers and ,.E
console.log(result); // "12.34.5,6e78Ee."
result = result.replaceAll(/(?<=[.,e].*)[.,]/gi, ""); // delete all dots and commas that are preceded by other dots, commas or exponent.
console.log(result); // "12.3456e78Ee" 
result = result.replaceAll(/(?<=e.*)e/gi, ""); // keep the first exponent and delete all others
console.log(result); // "12.3456e78"

如果您喜欢减号,可以添加第四步,请参见下面的代码。使用时,不要忘记在第一步中将减号添加到正则表达式中的允许字符列表中。

var s = "-12-34.-56e-7-8";
var result = s.replaceAll(/(?<!e|^)-/gi, ""); // delete minus signs if it is not directly preceded by an E, or if it does not stand at the beginning
console.log(result); // "-1234.56e-78"