【问题标题】:RegEx doesn´t work with Replace JavaScript MethodRegEx 不适用于替换 JavaScript 方法
【发布时间】:2020-07-16 00:04:27
【问题描述】:

我需要一些关于正则表达式的帮助,问题是我需要在 JavaScript 中使用 Replace 方法应用正则表达式。我在 Stackoverflow 看到了一些帖子,但是任何正则表达式都不起作用,我不知道为什么。

我需要用户只能输入以下数据:

100
100.2
100.23

注意:只有数字,最多可以有一位或两位小数。不允许使用其他符号,当然也不允许使用逗号。

我一直在阅读它,我使用了一些正则表达式生成器来查看匹配,所以我做了这个:

/^[a-zA-Z]+(\.[a-zA-Z]{0,2})?$/

一开始我有点迷糊,因为我在replace方法中使用了:

elementOne.addEventListener("input", function(event) {
   this.value = this.value.replace(/^[a-zA-Z]+(\.[a-zA-Z]{0,2})?$/, '');
});

现在我读到的过程如下:如果我输入一个从 a 到 z 的字母,该方法将替换为空格 ''。但其余的在方法中不起作用,但在生成器中起作用。

这是一个示例,您将在第一个输入中看到我的正则表达式与 Sven.hig 正则表达式:

const elementOne = document.getElementById('elementOne');
const elementTwo = document.getElementById('elementTwo');

elementOne.addEventListener("input", function(event) {
   this.value = this.value.replace(/^[a-zA-Z]+(\.[a-zA-Z]{0,2})?$/, '');
});

elementTwo.addEventListener("input", function(event) {
   this.value = this.value.replace(/^\d+[,]?\d{0,2}/, '');
});
<p>Element One (My RegEx)</p>
<input id="elementOne" type="text" />
<p>Element Two (Stack RegEx)</p>
<input id="elementTwo" type="text" />

也可以作为CodePen

【问题讨论】:

  • 我不清楚您要做什么。您的示例数据是数字,后跟一个可选的小数部分,但您的正则表达式说“用空字符串替换一对多的字母,后跟一个可选的点和 0-2 个字母。”你到底想做什么?
  • 您是否错误地使用了点. 而不是逗号,?你想匹配字母还是数字?
  • @ssc-hrep3 我使用点是因为帖子,我知道在拉丁美洲我们使用逗号。但可能是一样的。
  • @Jacob 这是我现在理解的替换过程的阅读:如果我尝试输入一个字母 [a-zA-Z]+,我将收到空白。但是如果我输入一个数字,我将被允许,但正则表达式的其余部分不起作用。我到底想做什么?只允许键入带小数的数字的输入。
  • 您可能想查看stackoverflow.com/questions/8282266stackoverflow.com/questions/13607278 了解如何限制输入。或者您可以使用&lt;input type="number"&gt;,它允许小数(但不允许组分隔符),并且它允许的小数字符应该基于区域设置。作为奖励,type="number" 通常会在移动设备上切换到数字键盘。

标签: javascript jquery regex


【解决方案1】:

您的正则表达式是匹配单词而不是数字,您应该将 [a-zA-Z]by [0-9]\. 替换为 \,

所以你的正则表达式应该看起来像这样/^[0-9]+(\,[0-9]{0,2})?/

或者你可以缩短模式/^\d+[,]?\d{0,2}/gm

这里是代码 sn-p 以防止用户输入与模式不匹配的单词或任何数字

const elementTwo = document.getElementById('elementTwo');
var flag=false
elementTwo.addEventListener("input", function(event) {
  pattern=/^\d+[,]?\d{0,2}$/
   if (pattern.test(this.value)){
         flag=true
         l=this.value
         if(flag&&this.value.length>1)
          return this.value
          else flag=false 
        
   }
  else if(!pattern.test(this.value)&&flag==true){
         return this.value=l
  
     }
       
     else if(!pattern.test(this.value)&&flag==false){
         return this.value=""
  
     }
       
});
<p>Element Two (Stack RegEx)</p>
<input id="elementTwo" type="text" />

【讨论】:

  • 我试过类似的方法,我可以输入字母。我现在用你的正则表达式试过了,我可以输入字母。这就是为什么我反其道而行之,而你认为​​我错了。也许可能是事件或类似的事情,我做错了。我将编辑我的帖子并添加一个带有两个输入的 CodePen,我的正则表达式和你的正则表达式。跟我来!
  • 我已经更新了我的答案并包含了一个代码 sn-p 检查它
  • 我正在尝试做的,我不知道测试方法。但是,例如,这是一种防止键入字母而不是在键入字母时删除所有内容的方法吗?
  • 你能举个例子吗?
  • 一个例子可能是:1).运行你的代码sn-p。 2).typedown 22 3).然后键入一个字母,输入中的所有内容都被删除。想一想,我已经筋疲力尽了,我整天都在这上面度过。抱歉,提前谢谢。 PD:我在想也许不返回空格,如果不返回最后输入的值,你怎么看? @Sven.hig
【解决方案2】:

您似乎混淆了一些事情:

  • 替换字符串中的无效字符
  • 定义验证模式
  • 防止输入文本

如果您的目标是验证您的字符串格式是否正确,您可以定义如下正则表达式:

const validFormat = /^\d+(,\d{0,2})?$/;
console.log(validFormat.test('99'));        // true
console.log(validFormat.test('100,23'));    // true
console.log(validFormat.test('X00,2E'));    // false
console.log(validFormat.test('%#&SJ&#UJ')); // false

如果您的目标是删除无效字符(非数字、非逗号),您可以为这些无效字符定义正则表达式,但这与确保您的字符串现在具有有效格式不同。 RegExp 不能做这样的事情:

const invalidChars = /[^\d,]/g;
const sanitized = someString.replace(invalidChars, '');

如果您想防止输入字符,最好将keydown 事件处理程序添加到您的输入中,并防止无效键的默认行为。

const myInput = document.querySelector('#some-input');
myInput.addEventListener('keydown', ({ key, preventDefault }) => {
  if (key !== ',' && (key < '0' || key > '9')) {
    preventDefault();
  }
});

【讨论】:

  • 不过,我肯定会接受@StephenP 的建议,即使用数字输入;把它留在这里,以防它对你或其他人仍然有用。
猜你喜欢
  • 2016-02-28
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2018-02-12
  • 2013-10-01
  • 1970-01-01
相关资源
最近更新 更多