【问题标题】:Javascript replace with regex not working correctly用正则表达式替换 Javascript 无法正常工作
【发布时间】:2018-04-12 15:41:15
【问题描述】:

我正在尝试使用正则表达式验证名称,正则表达式阻止用户连续输入 2 个空格或点。

这是我的代码:

function test(input) {
  var regex = /^[A-Za-z]+\.{0,1}\s{0,1}$/;
  input.value = input.value.replace(regex, "");
}
<input id="txt_NomCandidato" onkeyup="test(this);" type="text" class="form-control" name="txt_Nom">

现在想输入一个字母,不知道为什么,希望大家帮忙。

编辑:名称只包含字母,不包含数字。

【问题讨论】:

  • 仅供参考 {0,1}? 相同
  • 您的正则表达式与我假设您实际想要允许的匹配。由于您随后又使用它来替换,所以它会删除任何匹配它的东西。
  • ... 正则表达式阻止用户连续输入 2 个空格或点。不清楚您是否要避免两个空格与否。

标签: javascript html regex replace


【解决方案1】:

使用此解决方案,它只会删除第二个空格或第二个点,而第一个仍然会保留:

function test(input){
  var regex=/\.(?=\.)|\s(?=\s)/;
  input.value = input.value.replace(regex, "");
}
<input id="txt_NomCandidato" onkeyup="test(this);" type="text" class="form-control" name="txt_Nom">

【讨论】:

  • 你的正则表达式的问题是我可以输入数字和特殊字符
  • @YosetGA 所以你想要你自己的正则表达式验证加上双点和空格的东西?
【解决方案2】:

以下正则表达式应该适合您:/[^a-zA-Z. ]|\.(?=\.)|\s(?=\s)/g

  • [^a-zA-Z. ]+ 将所有允许的字符限制为 a-z、A-Z、点或空格
  • \.(?=\.) 将其限制为仅允许连续一个点
  • \s(?=\s) 将其限制为一行中的一个空格

每个都由 | 分隔(或条件)

function test(input) {
  var regex = /[^a-zA-Z. ]|\.(?=\.)|\s(?=\s)/g;
  input.value = input.value.replace(regex, "");
}
<input id="txt_NomCandidato" onkeyup="test(this);" type="text" class="form-control" name="txt_Nom">

【讨论】:

    【解决方案3】:

    您的正则表达式似乎是正确的(它匹配任何不超过 1 个空格或 1 个点的字符串),但您的函数中的逻辑似乎是错误的。

    它在做什么:每当值发生变化时,获取值并将任何与该正则表达式匹配的内容替换为空字符串,因此无论何时你写一个字符,它都会被替换(因为它与正则表达式匹配)。

    我会选择以下选项之一:

    a) 如果值与正则表达式不匹配,则显示一条消息

    b) 将正则表达式更改为 /。{2}| {2}/ 并且只替换两个点或两个空格,正如 Scath 在另一个答案中所说的那样

    c) 可能只使用原始正则表达式的输入模式属性就足够了:https://www.w3schools.com/TAGS/att_input_pattern.asp

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      要达到预期的效果,请使用以下切片选项

      input.value.slice(-2) 将返回最后两个输入的字符,如果是 ".." 或 " "(双空格) 将其替换为 ''

      function test(input){
        if(input.value.slice(-2)=='..' || input.value.slice(-2)=='  '){
               input.value = input.value.replace(input.value.slice(-2), "");
           }
      }
      <input id="txt_NomCandidato" onkeyup="test(this);" type="text" class="form-control" name="txt_Nom">

      代码示例 - https://codepen.io/nagasai/pen/VXNOej

      由于表达式 ^[A-Za-z]

      ,您的正则表达式会清除任何以 [A-Z] 或 [a-z] 开头的字符

      【讨论】:

        【解决方案5】:

        这个正则表达式不允许他们输入两个句点或两个空格,当他们输入第二个时,它会清除。

        function test(input){
          var regex=/\.{2}| {2}/;
          input.value = input.value.replace(regex, "").replace(/\d+|/g, '').replace(/\s+/g, ' ').replace(/[^\w]/, '');
        }
        <input id="txt_NomCandidato" onkeyup="test(this);" type="text" class="form-control" name="txt_Nom">

        【讨论】:

        • 这不会同时验证名称。
        • 我没有看到它的一部分被编辑为只允许字母以及停止点和空格。
        • 好的,现在也停止这些。
        • 您首先删除所有数字,然后将它们排除在删除之外。为什么?
        【解决方案6】:

        那是因为你匹配[A-Za-z]+,它将匹配一个或多个字符,之后的所有内容都是可选的。

        你的正则表达式会匹配。

        • [A-Za-z]+匹配一个或多个字符
        • \.{0,1} 匹配可选点(0 或 1 次)
        • \s{0,1} 匹配可选的空白字符(0 或 1 次)

        将匹配a,然后您将进行替换。

        要使某些内容可选,您还可以使用 question mark ?

        要只允许字符、单个空格或单个点,您可以替换所有不符合这些条件的内容:

        ([. ])(?=\1)|[^a-zA-Z. ]

        function test(input) {
          var regex = /([. ])(?=\1)|[^a-zA-Z. ]/;
          input.value = input.value.replace(regex, "");
        }
        <form id="" name="">
          <input id="txt_NomCandidato" onkeyup="test(this);" type="text" class="form-control" name="txt_Nom">
        </form>

        要匹配一个点后跟一个点或一个空格后跟一个空格,您可以在组中捕获一个点或一个空格,如果它后面是使用正数在组中捕获的内容,它将匹配lookahead.

        ([. ])(?=\1)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-25
          • 2016-05-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多