Xóa tất cả các ký tự đặc biệt ngoại trừ khoảng trắng khỏi chuỗi bằng JavaScript


157

Tôi muốn xóa tất cả các ký tự đặc biệt ngoại trừ khoảng trắng khỏi chuỗi bằng JavaScript.

Ví dụ, abc's test#s nên xuất như abcs tests.


3
Làm thế nào để bạn xác định nhân vật đặc biệt?
Keith Irwin

Câu trả lời:


348

Bạn nên sử dụng chức năng thay thế chuỗi, với một biểu thức chính. Giả sử bởi các ký tự đặc biệt, bạn có nghĩa là bất cứ điều gì không phải là chữ cái, đây là một giải pháp:

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


5
Để sử dụng giải pháp này vào bảng chữ cái phi-latin hãy kiểm tra câu trả lời này ra
efkan

Điều này cũng sẽ loại bỏ các ký tự số!
tech_geek

15
@tech_geek bạn có thể làmstr.replace(/[^a-zA-Z0-9]/g, "")
Chidi Williams

2
Trên thực tế bạn cần str.replace(/[^a-zA-Z0-9 ]/g, "");thông báo này có khoảng cách từ 0-9 đến]
Ammar Shah

Nó cần một số điều chỉnh, nó không xóa / hoặc - ký tự và ký tự đầu tiên của camelCase được viết bằng chữ thường, nhưng ký tự này viết hoa.
Sansun

132

Bạn có thể làm điều đó chỉ định các ký tự bạn muốn xóa:

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

Ngoài ra, để thay đổi tất cả các ký tự ngoại trừ số và chữ cái, hãy thử:

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

4
Nếu tôi không muốn xóa không gian bằng cách này thì sao? /[^a-zA-Z0-9]/g
aadi1295

8
@ArbazAbid để giữ không gian chỉ cần thêm nó vào các ký tự được liệt kê màu trắng. regex của bạn sẽ là "/ [^ a-zA-Z0-9] / g" (thông báo khoảng trắng sau 9)
Crhistian Ramirez

1
Đây là câu trả lời có hiệu quả, nếu cần một không gian.
Nathan

điều này thay thế ()whitespacestrong chuỗi.text().replace(/[ ()]/g, '')
C Alonso C Ortega

30

Giải pháp đầu tiên không hoạt động đối với bất kỳ bảng chữ cái UTF-8. (Nó sẽ cắt văn bản, chẳng hạn như Привіт). Tôi đã quản lý để tạo một chức năng không sử dụng RegExp và sử dụng hỗ trợ UTF-8 tốt trong công cụ JavaScript. Ý tưởng rất đơn giản nếu một biểu tượng bằng chữ in hoa và chữ thường nó là một ký tự đặc biệt. Ngoại lệ duy nhất được thực hiện cho khoảng trắng.

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

Cập nhật: Xin lưu ý rằng giải pháp này chỉ hoạt động đối với các ngôn ngữ có chữ in hoa và chữ in hoa nhỏ. Trong các ngôn ngữ như tiếng Trung Quốc, điều này sẽ không hoạt động.

Cập nhật 2: Tôi đã đến với giải pháp ban đầu khi tôi đang làm việc trên một tìm kiếm mờ. Nếu bạn cũng cố gắng loại bỏ các ký tự đặc biệt để thực hiện chức năng tìm kiếm, có một cách tiếp cận tốt hơn. Sử dụng bất kỳ thư viện chuyển ngữ nào sẽ tạo ra chuỗi của bạn chỉ từ các ký tự Latinh và sau đó Regapi đơn giản sẽ thực hiện tất cả các phép thuật loại bỏ các ký tự đặc biệt. (Điều này cũng sẽ hiệu quả với người Trung Quốc và bạn cũng sẽ nhận được lợi ích phụ bằng cách thực hiện Tromsø== Tromso).


Cảm ơn bạn cho giải pháp khá sáng tạo này. Nó phù hợp hơn nhiều với cách các ngôn ngữ thực sự hoạt động, vì nhiều người trong chúng ta không xem xét các ký tự đặc biệt "Привіт" hoặc "æøå". Hầu hết các giải pháp ngoài kia đều cắt bất kỳ ký tự nào không phải là một phần của bảng chữ cái tiếng Anh.
Alex Langberg

1
Gần như câu trả lời hoàn hảo cho tôi, nhưng thật không may, nó coi các ký tự Trung Quốc là các ký tự đặc biệt.
Eric Majerus

@EricMajerus và tiếng Hin-ddi cũng vậy
lập trình viên

Hãy cẩn thận, điều này cũng coi số là ký tự đặc biệt.
just_user

11

Tôi không biết JavaScript, nhưng không thể sử dụng regex?

Một cái gì đó giống như [^\w\d\s]sẽ phù hợp với bất cứ điều gì ngoại trừ chữ số, ký tự và khoảng trắng. Nó sẽ chỉ là một câu hỏi để tìm cú pháp trong JavaScript.


1
stackoverflow.com/a/4374890/2384606 Đây là câu trả lời cho câu hỏi của bạn :)
Carmela

8

Tôi đã thử giải pháp rất sáng tạo của Seagul, nhưng thấy nó cũng được coi là những con số đặc biệt, không phù hợp với nhu cầu của tôi. Vì vậy, đây là tinh chỉnh (failafe) của tôi về giải pháp của 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 '';
}

Bạn đã quên khai báo regtrong chức năng đầu tiên của bạn.
Noman Ali

6

tìm kiếm tất cả không (ký tự từ | | dấu cách):

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

1

Hãy thử sử dụng cái này

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

ở đây ^ carat là để phủ định \ w cho [a-zA-Z0-9_] ký tự từ và \ s cho dấu cách / [] / gi cho toàn cục


0

dấu chấm (.) có thể không được coi là đặc biệt. Tôi đã thêm một điều kiện OR vào câu trả lời của Mozfet & Seagull:

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

0

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

Những ký tự đặc biệt bạn muốn xóa khỏi chuỗi, chuẩn bị danh sách chúng và sau đó sử dụng chức năng thay thế javascript để xóa tất cả các ký tự đặc biệt.

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

hoặc bạn có thể chạy vòng lặp cho toàn bộ chuỗi và so sánh một ký tự đơn với mã ASCII và tạo lại một chuỗi mới.


9
Không, xin đừng làm vậy. Nó thực sự rất chậm. Nó là nhiều, tốt hơn nhiều để sử dụng một biểu thức thông thường.
Keith Irwin

Giải pháp này rất hay để thay thế chỉ một nhân vật. Trong trường hợp của tôi, nó rất hữu ích, cảm ơn.
Vahid Najafi

Thay vì sử dụng phương thức thay thế nhiều lần, vui lòng sử dụng một lần chỉ bằng cách sử dụng các biểu thức thông thường.
FAISAL
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.