Javascript 匹配不可打印/非ascii字符并从文本中删除

Javascript 匹配不可打印/非ascii字符并从文本中删除,javascript,regex,control-characters,Javascript,Regex,Control Characters,我的JavaScript已经很生锈了,所以任何关于这方面的帮助都会很好。我需要检测不可打印字符(控制字符,如SOH、BS等)以及扩展ascii字符,如字符串中的Ž,并将其删除,但我不确定如何编写代码 有人能告诉我怎么做的正确方向吗?这就是我到目前为止所做的: $(document).ready(function() { $('.jsTextArea').blur(function() { var pattern = /[^\000-\031]+/gi; v

我的JavaScript已经很生锈了,所以任何关于这方面的帮助都会很好。我需要检测不可打印字符(控制字符,如SOH、BS等)以及扩展ascii字符,如字符串中的Ž,并将其删除,但我不确定如何编写代码

有人能告诉我怎么做的正确方向吗?这就是我到目前为止所做的:

$(document).ready(function() {
    $('.jsTextArea').blur(function() {
        var pattern = /[^\000-\031]+/gi;
        var val = $(this).val();
        if (pattern.test(val)) {    
        for (var i = 0; i < val.length; i++) {
            var res = val.charAt([i]);
                alert("Character " + [i] + " " + res);              
        }          
    }
    else {
         alert("It failed");
     }

    });
});
$(文档).ready(函数(){
$('.jsTextArea').blur(函数(){
变量模式=/[^\000-\031]+/gi;
var val=$(this.val();
if(pattern.test(val)){
对于(变量i=0;i
您必须将一个模式(而不是字符串)分配到
isNonAscii
变量中,然后使用
test()
检查它是否匹配<代码>测试()返回true或false

$(document).ready(function() {
    $('.jsTextArea').blur(function() {
        var pattern = /[^\000-\031]+/gi;
        var val = $(this).val();
        if (pattern.test(val)) {
            alert("It matched");
        }
        else {
            alert("It did NOT match");
        }
    });
});

选中

无需测试,您可以直接处理文本框内容:

textBoxContent = textBoxContent.replace(/[^\x20-\x7E]+/g, '');
其中范围
\x20-\x7E
包括ascii表的可打印部分

代码示例:

$('.jsTextArea').blur(function() {
    this.value = this.value.replace(/[^\x20-\x7E]+/g, '');
});

要将不属于可打印基本ASCII范围的字符作为目标,可以使用以下简单的正则表达式:

[^ -~]+
说明:在的前128个字符中,可打印范围以空格字符开始,以波浪号结束。这些是您要保留的字符。该范围用
[-~]
表示,不在该范围内的字符用
[^-~]
表示。这些是我们要替换的。因此:

result = string.replace(/[^ -~]+/g, "");

对于那些有此问题并正在寻找“修复所有问题”解决方案的人。。。这就是我最终修复它的方式:

public static string RemoveTroublesomeCharacters(string inString)
{
    if (inString == null)
    {
        return null;
    }

    else
    {
        char ch;
        Regex regex = new Regex(@"[^\u0000-\u007F]", RegexOptions.IgnoreCase);
        Match charMatch = regex.Match(inString);

        for (int i = 0; i < inString.Length; i++)
        {
            ch = inString[i];
            if (char.IsControl(ch))
            {
                string matchedChar = ch.ToString();
                inString = inString.Replace(matchedChar, string.Empty);
            }
        }

        while (charMatch.Success)
        {
            string matchedChar = charMatch.ToString();
            inString = inString.Replace(matchedChar, string.Empty);
            charMatch = charMatch.NextMatch();
        }
    }       

    return inString;
}
publicstaticstringremovetroublesomecharacters(stringinstring)
{
if(inString==null)
{
返回null;
}
其他的
{
char ch;
Regex Regex=new Regex(@“[^\u0000-\u007F]”,RegexOptions.IgnoreCase);
匹配字符匹配=正则匹配(inString);
对于(int i=0;i
我将为那些经验不足的人详细介绍一下:

  • 我们首先遍历整个字符串的每个字符,并使用char的IsControl方法来确定一个字符是否为控制字符

  • 如果找到控制字符,请将匹配的字符复制到字符串,然后使用Replace方法将控制字符更改为空字符串。冲洗并重复操作绳子的其余部分

  • 循环遍历整个字符串后,我们将使用定义的正则表达式(它将匹配非控制字符或标准ascii字符的任何字符),并再次使用空字符串替换匹配的字符。在while循环中执行此操作意味着在charMatch为true时,角色将被替换

  • 最后,删除所有字符并循环整个字符串后,返回inString


  • (注意:我还没有找到如何用新修改的inString值重新填充文本框的方法,因此如果有人能指出如何进行,那就太好了)

    应该这样调用
    match
    属性:
    isNonAscii.match($(this.val())
    )。程序不会神奇地知道您想要将输入值与正则表达式匹配。谢谢您的输入。这是有道理的,但是我如何从文本框中的字符串中删除检测到的无效字符呢?我决定改变我的方法,并选择服务器端解决方案(因为javascript有时可以在客户端浏览器中关闭)@GrantTool:不要通过完全更改问题的代码来使现有答案无效。非常感谢您的回答,但是我如何检测无效字符,从字符串中删除if并替换文本框中没有无效字符的新字符串?使用
    replace()
    函数应该可以正常工作。你可以直接做,而不是那段代码@CasimimiritHippolyte的代码运行良好,感谢您的输入,但这不起作用,因为replace函数仅适用于可打印字符。控件字符(如BS、SOH、ACK等)是不可见的,因此不能用.replace方法提取。@grantTool:多么疯狂的想法!字符不可打印并不意味着替换方法找不到它!替换方法适用于任何字符(可打印或不可打印)。真的吗?这很奇怪,因为我刚刚测试了它,但它不起作用?你能给我看一下吗?@GrantDoole:我会给我的答案加上一个小测试。@GrantDoole:我忘了加g修饰符,这可能是你没有得到预期结果的原因。事实上更简单。@Casimirithippolyte谢谢,Caz.)大家好,所有问题的答案都很好,但我即将解决。虽然value.replace工作得很好,但它并不是我所需要的。我将用我目前所拥有的更新原始帖子。这将取代换行符/回车符,因此它不适用于多行文本。2019年,这仍然是我遇到的最优雅的解决方案。是的,它删除了换行符、回车符和制表符,但对于那些实际试图去除这些字符的人来说,这个解决方案非常漂亮,而且很容易让人读懂。你有完全正确的答案