Xóa tất cả các ký tự đặc biệt bằng RegExp


233

Tôi muốn một RegExp sẽ xóa tất cả các ký tự đặc biệt khỏi chuỗi. Tôi đang thử một cái gì đó như thế này nhưng nó không hoạt động trong IE7, mặc dù nó hoạt động trong Firefox.

var specialChars = "!@#$^&%*()+=-[]\/{}|:<>?,.";

for (var i = 0; i < specialChars.length; i++) {
  stringToReplace = stringToReplace.replace(new RegExp("\\" + specialChars[i], "gi"), "");
}

Một mô tả chi tiết về RegExp cũng sẽ hữu ích.


18
Một cái gì đó như thế này sẽ tốt hơn là một danh sách trắng, không phải là một danh sách đen. sau đó bạn chỉ có thể làm [az] | [0-9] | \ s
Ape-inago

Bất kỳ lỗi script? Bạn đã gỡ lỗi? Hoặc nếu không, hãy thử ... bắt khối trong mã javascript.
Kangkan

@ Ape-inago bạn có thể vui lòng giải thích thêm về RegExp một chút cho tôi không
Timothy Ruhle

3
Vui lòng xác định "nhân vật đặc biệt"! "" Có đặc biệt với bạn không? (Tư duy về vấn đề này bạn sẽ thấy @ điểm Ape-iango của.)
deceze

7
Tôi không nghĩ bất cứ ai ở đây có nghĩa là bất kỳ hành vi phạm tội. Trước đây tôi đã bị đốt cháy khi thực hiện nó như một danh sách đen vì luôn có những "gotcha" nhỏ bé cuối cùng vượt qua (như ví dụ về sự lừa dối). Cuối cùng, cách tiếp cận đúng là nhiều hơn về lý do tại sao bạn đang cố gắng làm điều này.
Ape-inago

Câu trả lời:


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

Như đã đề cập trong các bình luận, việc thực hiện điều này như một danh sách trắng sẽ dễ dàng hơn - thay thế các ký tự không có trong danh sách an toàn của bạn.

Ký tự caret ( ^) là phủ định của tập hợp [...], ginói toàn cục và không phân biệt chữ hoa chữ thường (phần sau hơi thừa nhưng tôi muốn đề cập đến nó) và safelist trong ví dụ này là chữ số, ký tự từ, dấu gạch dưới ( \w) và khoảng trắng ( \s).


50
Giải pháp này không hoạt động cho các biểu tượng không phải tiếng Anh. "Ví dụ".
Hải âu

4
Bạn cũng có thể sử dụng chữ hoa \ W thay vì ^ \ w. \ W: Khớp với bất kỳ ký tự không phải từ nào. Tương đương với [^ A-Za-z0-9_]. developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/
mẹo

@Seagull Tôi đã thêm một câu trả lời xử lý Unicodes.
freedev

1
để chấp nhận các từ có dấu, như trong ngôn ngữ Bồ Đào Nha, hãy làm điều này: stringToReplace.replace (/ [^ A-zÀ-ú \ s] / gi, '')
alansiqueira27

1
Để thêm hầu hết các ngôn ngữ châu Âu (tiếng Na Uy, tiếng Sweedish, tiếng Đức, tiếng Portoguise, tiếng Tây Ban Nha), chuỗiToReplace.replace (/ [^ \ w \ s \ xc0-xff] / gi, ''). Để bao gồm các ngôn ngữ khác phạm vi unicode có thể được sử dụng. Xem: stackoverflow.com/questions/150033/
Mạnh

104

Lưu ý rằng nếu bạn vẫn muốn loại trừ một bộ, bao gồm những thứ như dấu gạch chéo và ký tự đặc biệt, bạn có thể thực hiện các thao tác sau:

var outString = sourceString.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '');

đặc biệt lưu ý rằng để bao gồm cả ký tự "trừ", bạn cần thoát nó bằng dấu gạch chéo ngược như nhóm sau. nếu bạn không, nó cũng sẽ chọn 0-9, điều này có thể không mong muốn.


10
giải pháp tuyệt vời! câu trả lời được chấp nhận chỉ hoạt động bằng tiếng Anh, điều này hoạt động trên bất kỳ ngôn ngữ nào (theo như tôi đã kiểm tra). cảm ơn :)
Ronen Ness

1
@knutole xóa phần ?từ bộ ký tự về phía trước. cái này liệt kê các ký tự bạn muốn loại bỏ, do đó loại trừ nó khỏi bị tước sẽ bao gồm nó trong kết quả cuối cùng.
tham gia

Điều này hoạt động tuyệt vời, phù hợp hoàn hảo cho bất kỳ ngôn ngữ nào, chỉ cần thêm char mà bạn muốn thay thế và đó là tất cả. Cảm ơn.
Elros Romeo

21

Regex Javascript đơn giản không xử lý các chữ cái Unicode .

Không sử dụng [^\w\s], điều này sẽ xóa các chữ cái có dấu (như àèéìòù), chưa kể đến tiếng Cyrillic hoặc tiếng Trung Quốc, các chữ cái đến từ các ngôn ngữ đó sẽ bị xóa.

Bạn thực sự không muốn xóa những chữ cái này cùng với tất cả các ký tự đặc biệt. Bạn có hai cơ hội:

  • Thêm vào regex của bạn tất cả các ký tự đặc biệt bạn không muốn xóa,
    ví dụ : [^èéòàùì\w\s].
  • Có một cái nhìn tại xregapi.com . XRegExp thêm hỗ trợ cơ sở cho kết hợp Unicode thông qua \p{...}cú pháp.

var str = "Їжак::: résd,$%& adùf"
var search = XRegExp('([^?<first>\\pL ]+)');
var res = XRegExp.replace(str, search, '',"all");

console.log(res); // returns "Їжак::: resd,adf"
console.log(str.replace(/[^\w\s]/gi, '') ); // returns " rsd adf"
console.log(str.replace(/[^\wèéòàùì\s]/gi, '') ); // returns " résd adùf"
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.js"></script>


3
Rất tốt để biết về quốc tế hóa, tôi không biết rằng regex của JS không phải là UTF-8.
LessQuesar

Bạn không thể đặt tất cả các chữ cái UTF-8 hợp lệ vào var str
Seagull

@Seagull có, nhưng trong trường hợp bạn không viết ứng dụng tương thích toàn thế giới, bạn thực tế chỉ có thể đặt danh sách các chữ cái UTF-8 hợp lệ cho các bản địa hóa hiện tại của bạn. Trong trường hợp của tôi, đối với ngôn ngữ Ý chỉ có vài chữ cái.
freedev

7

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).


Tuyệt vời, như câu trả lời này! Tôi sử dụng nó để tạo một tên tệp hợp lệ và để nó mở rộng giải pháp của bạn để loại bỏ khoảng trắng (tương thích với Linux / Unix) và cũng cho phép số. Vì vậy, tôi đã mở rộng câu lệnh if (liên quan đến jQuery): if (str [i]! == '' && (low [i]! = Upper [i] | | low [i] .trim () === '' | | $ .isNumeric (str [i])))
Jonny

trong nhiều ngôn ngữ không có chữ in hoa ... do đó, hàm sẽ coi đầu vào hợp lệ là ký tự đặc biệt
Yair Levy

Các ký tự Trung Quốc là một ví dụ bị loại bỏ bởi điều này
lethek

Thật không may, khi tôi tạo ra giải pháp này, thật không may, tôi đã không nghĩ về các ngôn ngữ như tiếng Trung Quốc. Giải pháp phải được đề xuất, vì các câu trả lời trước cũng không hoạt động.
Hải âu

1

Tôi sử dụng RegexBuddy để gỡ lỗi regex của mình, nó có hầu hết các ngôn ngữ rất hữu ích. Hơn sao chép / dán cho ngôn ngữ được nhắm mục tiêu. Công cụ tuyệt vời và không đắt lắm.

Vì vậy, tôi sao chép / dán regex của bạn và vấn đề của bạn là [,] là các ký tự đặc biệt trong regex, vì vậy bạn cần phải thoát chúng. Vì vậy, regex nên là: /!@#$ ^ &


0

tại sao bạn không làm điều gì đó như:

re = /^[a-z0-9 ]$/i;
var isValid = re.test(yourInput);

để kiểm tra xem đầu vào của bạn có chứa bất kỳ char đặc biệt nào không


17
OP cho biết anh ta đang cố gắng loại bỏ các ký tự đặc biệt để xem liệu chúng có tồn tại không.
annakata

Đây là một trong những giải pháp tốt nhưng điều này sẽ chỉ cho phép số chữ cái trong bảng chữ cái tiếng Anh và khoảng èéòàùì
trắng

0

str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "")Tôi đã làm sth như thế này. Nhưng có một số người đã làm nó dễ dàng hơn nhiều nhưstr.replace(/\W_/g,"");


Hầu hết những điều trong cách tiếp cận của bạn là dư thừa, vì \Wcó chứa một số các nhân vật. Nhưng tại sao bạn lại lọc số? Đó không phải là những nhân vật đặc biệt.
dùng4642212
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.