【问题标题】:Remove all special characters except space from a string using JavaScript使用 JavaScript 从字符串中删除除空格外的所有特殊字符
【发布时间】:2011-09-27 03:57:16
【问题描述】:

我想使用 JavaScript 从字符串中删除除空格以外的所有特殊字符。

例如, abc's test#s 应该输出为 abcs tests.

【问题讨论】:

  • 特殊字符是怎么定义的?

标签: javascript special-characters


【解决方案1】:

你想从字符串中删除哪些特殊字符,准备一个列表,然后使用 javascript 替换函数来删除所有特殊字符。

var str = 'abc'de#;:sfjkewr47239847duifyh';
alert(str.replace("'","").replace("#","").replace(";","").replace(":",""));

或者您可以对整个字符串运行循环并将单个字符与 ASCII 码进行比较并重新生成一个新字符串。

【讨论】:

  • 不,请不要那样做。它真的非常慢。使用正则表达式要好得多。
  • 这个解决方案非常适合只替换一个字符。就我而言,这很有帮助,谢谢。
  • 不要多次使用replace方法,请只使用正则表达式一次。
  • 如果出现更多字符,此解决方案将失败,常规 exp 是执行此操作的通用方式并且速度很快
【解决方案2】:

您应该使用字符串替换功能,使用单个正则表达式。 假设通过特殊字符,您的意思是任何不是字母的东西,这里有一个解决方案:

const str = "abc's test#s";
console.log(str.replace(/[^a-zA-Z ]/g, ""));

【讨论】:

  • 要在非拉丁字母上使用此解决方案,请查看this answer out
  • 这也会删除数字字符!
  • 其实你需要这个str.replace(/[^a-zA-Z0-9 ]/g, "");注意0-9和]之间有一个空格
  • 它需要一些调整,它没有删除 / 或 - 字符,camelCase 的第一个字符应该是小写的,但这个是大写的。
  • 这会留下类似的东西:pspanspanstrongItem SKUstrongnbspspanspanKBRspanspanpp This 好一点。
【解决方案3】:

我不懂 JavaScript,但不能使用正则表达式吗?

[^\w\d\s] 之类的内容将匹配除数字、字符和空格之外的任何内容。在 JavaScript 中找到语法只是一个问题。

【讨论】:

【解决方案4】:

您可以指定要删除的字符:

string = string.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, '');

或者,要更改除数字和字母以外的所有字符,请尝试:

string = string.replace(/[^a-zA-Z0-9]/g, '');

【讨论】:

  • 如果我不想使用它删除空间怎么办? /[^a-zA-Z0-9]/g
  • @ArbazAbid 保留空间只需将其添加到白名单字符。您的正则表达式将是“/[^a-zA-Z0-9 ]/g”(注意 9 之后的空格)
  • 如果需要空格,这是有效的答案。
  • 这将替换字符串.text().replace(/[ ()]/g, '')中的()whitespaces
  • 那个正则表达式代表什么?除了字母数字字符之外还有什么?正则表达式中的否定符号是什么?
【解决方案5】:

第一个解决方案不适用于任何 UTF-8 字母。 (它将剪切文本,例如Привіт)。我设法创建了一个不使用 RegExp 并在 JavaScript 引擎中使用良好的 UTF-8 支持的函数。这个想法很简单,如果一个符号在大写和小写中相等,它就是一个特殊字符。唯一的例外是空格。

function removeSpecials(str) {
    var lower = str.toLowerCase();
    var upper = str.toUpperCase();

    var res = "";
    for(var i=0; i<lower.length; ++i) {
        if(lower[i] != upper[i] || lower[i].trim() === '')
            res += str[i];
    }
    return res;
}

更新:请注意,此解决方案仅适用于有大小写字母的语言。在像中文这样的语言中,这是行不通的。

更新 2:我在进行模糊搜索时找到了原始解决方案。如果您还尝试删除特殊字符以实现搜索功能,则有更好的方法。使用任何transliteration library,它只会从拉丁字符生成字符串,然后简单的正则表达式将完成删除特殊字符的所有魔法。 (这也适用于中国人,您还可以通过制作Tromsø == Tromso 获得附带好处)。

【讨论】:

  • 感谢您提供这个非常有创意的解决方案。它更符合语言的实际工作方式,因为我们中的许多人不考虑“Привіт”或“æøå”特殊字符。大多数解决方案都会删除任何不属于英文字母的字符。
  • 对我来说几乎是完美的答案,但不幸的是它认为汉字是特殊字符。
  • @EricMajerus 和印地语
  • 小心,这也将数字视为特殊字符。
【解决方案6】:

我尝试了 Seagul 非常有创意的解决方案,但发现它也将数字视为特殊字符,这不符合我的需要。所以这是我对 Seagul 解决方案的(故障安全)调整...

//return true if char is a number
function isNumber (text) {
  if(text) {
    var reg = new RegExp('[0-9]+$');
    return reg.test(text);
  }
  return false;
}

function removeSpecial (text) {
  if(text) {
    var lower = text.toLowerCase();
    var upper = text.toUpperCase();
    var result = "";
    for(var i=0; i<lower.length; ++i) {
      if(isNumber(text[i]) || (lower[i] != upper[i]) || (lower[i].trim() === '')) {
        result += text[i];
      }
    }
    return result;
  }
  return '';
}

【讨论】:

  • 您忘记在第一个函数中声明reg
【解决方案7】:

点 (.) 可能不被认为是特殊的。我在 Mozfet 和 Seagull 的回答中添加了 OR 条件:

function isNumber (text) {
      reg = new RegExp('[0-9]+$');
      if(text) {
        return reg.test(text);
      }
      return false;
    }

function removeSpecial (text) {
  if(text) {
    var lower = text.toLowerCase();
    var upper = text.toUpperCase();
    var result = "";
    for(var i=0; i<lower.length; ++i) {
      if(isNumber(text[i]) || (lower[i] != upper[i]) || (lower[i].trim() === '') || (lower[i].trim() === '.')) {
        result += text[i];
      }
    }
    return result;
  }
  return '';
}

【讨论】:

    【解决方案8】:

    搜索所有不(单词字符||空格):

    str.replace(/[^\w ]/, '')
    

    【讨论】:

    • 完美!从字符串中删除所有特殊的 unicode 字符。
    • 这是我用来搜索名字+姓氏的一个很好的解决方案。它也处理重音字符 (é)。我添加了一个撇号来处理像 D'Angelo 这样的名字。
    【解决方案9】:

    尝试使用这个

    var result= stringToReplace.replace(/[^\w\s]/g, '')
    

    [^] 用于否定,\w 用于 [a-zA-Z0-9_] 单词字符,\s 用于空格, /[]/g 全球

    【讨论】:

      【解决方案10】:

      const input = `#if_1 $(PR_CONTRACT_END_DATE) == '23-09-2019' # 
      Test27919<alerts@imimobile.com> #elseif_1 $(PR_CONTRACT_START_DATE) ==  '20-09-2019' #
      Sender539<rama.sns@gmail.com> #elseif_1 $(PR_ACCOUNT_ID) == '1234' #
      AdestraSID<hello@imimobile.co> #else_1#Test27919<alerts@imimobile.com>#endif_1#`;
      const replaceString = input.split('$(').join('->').split(')').join('<-');
      
      
      console.log(replaceString.match(/(?<=->).*?(?=<-)/g));

      【讨论】:

        【解决方案11】:

        试试这个:

        const strippedString = htmlString.replace(/(<([^>]+)>)/gi, "");
        console.log(strippedString);
        

        【讨论】:

        • 这会将 ' 和 # 留在剥离的字符串中。示例输出:“abc's test#s”
        【解决方案12】:

        const str = "abc's@thy#^g&test#s";
        console.log(str.replace(/[^a-zA-Z ]/g, ""));

        【讨论】:

        • 请补充说明你做了什么
        • 数字不是特殊字符,会被删除
        • ąčęėįšųūž 这样的字母在某些情况下可能不是“特殊”字符,它们将被删除。还有所有带有本地字母的日语/中文和其他语言。此代码将仅保留英文字母 a-z 和 A-Z。
        【解决方案13】:

        试试这个以获得相同的结果我在这里有一个示例,您可以对其进行编辑或使其更高效:

        <!DOCTYPE html>
        <html lang="en">
        
        <head>
            <meta charset="UTF-8">
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>Validation example</title>
        </head>
        
        <body>
            <div>
                <!-- optional form element for HTML5 Validation on submit 
                    - the Vanilla js code below can work well without a form element 
        
                    =====================================================
                    So you can decide to use the HTML5 validation on top of JS validation when you use a form with a submit button
                    But if you use the input element only then you have to rely on the js validation only
                -->
                <form id="search-form">
                    <input type="text" pattern="[A-Za-z\s0-9]{3,}" title="Only letters, numbers and spaces are allowed" placeholder="Search" name="search" id="search-input">
                    <!-- optional submit button if using a form -->
                    <button type="submit">Submit</button>
                </form>
            </div>
            <script>
                window.onload = function () {
                    var inputElementRef = document.getElementById("search-input"); //use id selector for precise selection in a large html document
                    var inputSearchValue = "";
                    inputElementRef.addEventListener("keydown", function (e) {
                        inputSearchValue = e.target.value;
                        // replace invalid characters if you are not using HTML5 validation this will ensure the value 
                        //  is always the expected string format
                        inputSearchValue = inputSearchValue.replace(/[^a-zA-Z\s]/g,"");
        
                    });
                    // whenever you change the value you can retrieve it from var inputSearchValue
                    // For example
                    var handleFormSubmit = function (e) {
                        e.preventDefault();
                        console.log('inputSearchValue', inputSearchValue)
                    }
                    var optionalSearchFormRef = document.getElementById("search-form");
                    optionalSearchFormRef.addEventListener("submit", handleFormSubmit);
                }
            </script>
        </body>
        
        </html>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-16
          • 2014-08-17
          • 1970-01-01
          • 2011-08-16
          • 2013-07-22
          • 2014-02-22
          • 2021-04-23
          相关资源
          最近更新 更多