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

时间:2014-06-15 11:44:57

标签: javascript regex control-characters

我的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");
     }

    });
});

4 个答案:

答案 0 :(得分:44)

要定位不属于可打印基本ASCII范围的字符,您可以使用这个简单的正则表达式:

[^ -~]+

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

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

答案 1 :(得分:33)

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

textBoxContent = textBoxContent.replace(/[^\x20-\x7E]+/g, '');

其中范围\x20-\x7E涵盖ascii表的可打印部分。

代码示例:

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

答案 2 :(得分:1)

您必须将模式(而不是字符串)分配到isNonAscii变量中,然后使用test()检查它是否匹配。 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");
        }
    });
});

检查jsFiddle

答案 3 :(得分:-6)

对于那些遇到此问题且正在寻找“全部解决方案”的人。解决方案...这就是我最终解决它的方法:

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;
}

对于经验不足的人,我会详细介绍一下:

  1. 我们首先循环遍历整个字符串的每个字符,并使用char的IsControl方法来确定字符是否是控制字符。

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

  3. 一旦我们遍历整个字符串,我们就会使用定义的正则表达式(它将匹配任何不是控制字符或标准ascii字符的字符),并再次用空字符串替换匹配的字符。在while循环中执行此操作意味着charMatch始终为true,将替换该字符。

  4. 最后删除所有字符后我们将整个字符串循环,然后返回inString。

  5. (注意:我还没有设法弄清楚如何使用新修改的inString值重新填充TextBox,所以如果有人能指出如何做到这一点会很棒)