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

kuhbmx9i  于 2022-11-26  发布在  其他
关注(0)|答案(5)|浏览(114)

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

    });
});
ojsjcaue

ojsjcaue1#

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

[^ -~]+

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

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

3df52oht2#

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

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

其中范围\x20-\x7E覆盖ASCII表的可打印部分。
代码示例:

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

ocebsuys3#

如果您正在寻找一个超越ascii的解决方案,并且不需要去除Unicode字符,请阅读以下内容:

function stripNonPrintableAndNormalize(text) {
    // strip control chars
    text = text.replace(/\p{C}/gu, '');

    // other common tasks are to normalize newlines and other whitespace

    // normalize newline
    text = text.replace(/\n\r/g, '\n');
    text = text.replace(/\p{Zl}/gu, '\n');
    text = text.replace(/\p{Zp}/gu, '\n');

    // normalize space
    text = text.replace(/\p{Zs}/gu, ' ');

    return text;
}

在www.example.com上定义了各种unicode类标识符(例如,Zl表示行分隔符)https://www.unicode.org/reports/tr44/#GC_Values_Table,如下所示:
| 缩写|长|项目名称|
| - -|- -|- -|
| 吕|大写字母(_L)|大写字母|
| 我|小写字母(_L)|小写字母|
| 左侧|标题大小写_字母|一种二合字符,第一部分大写|
| 液相色谱|大小写字母|卢|利|左|
| 长度|修饰符_字母|修饰字母|
| 洛|其他_信函|其他字母,包括音节和表意文字|
| 左|信函|卢|力||林|卢|
| 锰|无间距标记(_M)|无间隔组合标记(零前进宽度)|
| 麦克|间距标记(_M)|间隔组合标记(正前进宽度)|
| 我|封闭标记(_M)|封闭组合标记|
| 米|标记|锰|Mc| Me|
| 钕|十进制数字(_N)|十进制数字|
| 无|信函编号(_N)|字母状数字字符|
| 没有|其他_号码|其他类型的数字字符|
| 不|编号|Nd| Nl|编号|
| 个人电脑|连接符_标点|连接标点符号,如领带|
| 钯|破折号_标点符号|破折号或连字符标点符号|
| Ps级|打开标点(_P)|(一对的)开头标点符号|
| 平|关闭标点符号(_P)|结束标点符号|
| 圆周率|首字母标点(_P)|首引号|
| 功率因数|结尾标点符号(_P)|最后的引号|
| 波|其他_标点符号|其他类型标点符号|
| P值|标点符号|Pc| Pd| Ps| Pe| Pi| Pf| Po(峰峰值)|
| 钐|数学符号(_S)|数学符号|
| 扫描|货币_符号|货币符号|
| 斯克|修饰符符号(_S)|非字母状修饰符符号|
| 所以|其他符号(_S)|其他类型符号|
| 标准|符号|史|史||苏|
| Z值|空格_分隔符|空格字符(各种非零宽度)|
| Zl语言|行分隔符(_S)|仅U+2028线路分离器|
| Zp值|段落分隔符(_S)|仅U+2029段落分隔符|
| Z轴|分隔符|Zs| Zl| Zp|
| 副本|对照组|C 0或C1控制代码|
| 对比系数|格式Name|格式控制字符|
| 铯|替代|代理代码点|
| 科|私人使用(_U)|私用字符|
| 中国|未分配|保留的未分配码位或非字符|
| C语言|其他|Cc| Cf| Cs|公司|Cn|

ttvkxqim

ttvkxqim4#

您必须将一个模式(而不是字符串)赋给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

hrysbysz

hrysbysz5#

对于那些谁有这个问题,并正在寻找一个'修复所有'的解决方案...这是我最终修复它的方式:

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方法来确定某个字符是否是控制字符。
1.如果找到控制字符,将匹配的字符复制到字符串中,然后使用Replace方法将控制字符更改为空字符串。对字符串的其余部分重复上述步骤。
1.一旦我们循环遍历了整个字符串,我们就使用定义的正则表达式(它将匹配任何不是控制字符或标准ASCII字符的字符),并再次用空字符串替换匹配的字符。在while循环中这样做意味着,只要charMatch为真,字符就会被替换。
1.最后,删除所有字符并循环整个字符串后,返回inString。
(Note:我还没有想好如何用新修改的inString值重新填充TextBox,所以如果有人能指出如何完成这一点,那就太好了)

相关问题