需要识别正则表达式中的不匹配字符

Need to identify the non-matching character in regex

本文关键字:不匹配 字符 正则表达式 识别      更新时间:2023-09-26

当用户在保存内容之前提供'版本名'时,我们使用正则表达式来测试'非法'字符。接受的字符为:A-Z、0-9和空格。我们使用以下命令进行测试:

var version_name = document.getElementById('txtSaveVersionName').value;
if(version_name.search(/[^A-Za-z0-9's]/)!= -1){ 
  alert("Warning illegal characters have been removed etc");
  version_name.replace(/[^A-Za-z0-9's]/g,'');
  document.getElementById('txtSaveVersionName').value = version_name;
}

当用户键入他们的版本名时,这工作得很好。然而,版本名也可以从动态填充的选择框中获取的数据中填充-从我们的系统加载的版本名。

发生这种情况时,regexp抛出名称中的空格。所以"我的版本"变成了"我的版本"?当用户输入"我的版本"时,不会发生这种情况。

因此,从选择框中获取的值似乎包含一个看起来像空格但不是空格的字符。我已经将这个值从文本框复制到一个unicode转换器(http://rishida.net/tools/conversion/)中,该转换器标识了基础值的字符,两个集合都报告为0020(空格),但只有一个抛出异常??

是否有办法确定是什么字符导致了这个问题?

任何想法都非常感谢!

欢呼马克

尝试:

var str= getSelectBoxValue();
var rez = ""; 
for (var i=0;i<str.length;i++) 
    rez = rez+str[i]+"["+str.charCodeAt(i)+"]"; 
alert(rez);

它应该以Javascript看到的方式给你字符串中所有字符的unicode值。当您从屏幕上复制它时,可能是浏览器/操作系统出于某种原因将一些奇怪的UTF字符转换为常规的"0x20"字符。

我注意到你的代码中有一个bug:

version_name.replace(/[^A-Za-z0-9's]/g,'');

应该是

version_name = version_name.replace(/[^A-Za-z0-9's]/g,'');

当然,replace创建了一个新的字符串,它不会修改现有的字符串。

正如你所发现的那样,替换有时有效,有时无效会怀疑您在一个地方正确地实现了这个,而在另一个地方却不正确。