33

私の 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

4 に答える 4

80

印刷可能な基本 ASCII 範囲の一部ではない文字をターゲットにするには、次の単純な正規表現を使用できます。

[^ -~]+

説明: ASCII テーブルの最初の 128 文字で、印刷可能な範囲はスペース文字で始まり、チルダで終わります。残しておきたいキャラです。その範囲を で表し、その範囲外[ -~]の文字を で表し[^ -~]ます。これらは私たちが置き換えたいものです。したがって:

result = string.replace(/[^ -~]+/g, "");
于 2014-06-15T15:46:06.180 に答える
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 を確認する

于 2014-06-15T11:55:13.773 に答える
-8

この問題を抱えていて、「すべてを修正する」解決策を探している人のために...これは私が最終的に修正した方法です:

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 が返されます。

(注:新しい変更されたinString値でTextBoxを再設定する方法をまだ理解できていないので、誰かがそれを行う方法を指摘できればそれは素晴らしいことです)

于 2014-07-12T10:47:55.753 に答える