在特定条件下只接受数字和特定字符的正则表达式 javascript (Vue.js)
Regular expression that only accepts numbers and certain characters under certain conditions with javascript (Vue.js)
任何人都可以帮助我使用执行以下操作的正则表达式:
- 只接受 0-9 的数字
- 仅接受以下只能出现一次的字符:“e”、“,”和“.”
- 输入句点后,不能再输入逗号,反之亦然
- 'e'
后不能输入逗号或句号
我希望有人能帮我解决这个问题,我自己并不擅长正则表达式,但我知道它们很强大。但是,如果有其他方法可用,请告诉我。
我已经通过不同的方法自己尝试过。不幸的是,我编写的代码无法正常工作,如下所示:
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"
任何人都可以帮助我使用执行以下操作的正则表达式:
- 只接受 0-9 的数字
- 仅接受以下只能出现一次的字符:“e”、“,”和“.”
- 输入句点后,不能再输入逗号,反之亦然
- 'e' 后不能输入逗号或句号
我希望有人能帮我解决这个问题,我自己并不擅长正则表达式,但我知道它们很强大。但是,如果有其他方法可用,请告诉我。 我已经通过不同的方法自己尝试过。不幸的是,我编写的代码无法正常工作,如下所示:
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"