Xóa các ký tự không phải chữ và số khỏi chuỗi


224

Tôi muốn chuyển đổi chuỗi sau thành đầu ra được cung cấp.

Input:  "\\test\red\bob\fred\new"
Output: "testredbobfrednew"

Tôi đã không tìm thấy bất kỳ giải pháp mà sẽ xử lý ký tự đặc biệt như \r, \n, \bvv

Về cơ bản tôi chỉ muốn loại bỏ bất cứ thứ gì không phải là chữ và số. Đây là những gì tôi đã thử ...

Attempt 1: "\\test\red\bob\fred\new".replace(/[_\W]+/g, "");
Output 1:  "testedobredew"

Attempt 2: "\\test\red\bob\fred\new".replace(/['`~!@#$%^&*()_|+-=?;:'",.<>\{\}\[\]\\\/]/gi, "");
Output 2:  "testedobred [newline] ew"

Attempt 3: "\\test\red\bob\fred\new".replace(/[^a-zA-Z0-9]/, "");
Output 3:  "testedobred [newline] ew"

Attempt 4: "\\test\red\bob\fred\new".replace(/[^a-z0-9\s]/gi, '');
Output 4:  "testedobred [newline] ew"

Một nỗ lực khác với nhiều bước

function cleanID(id) {
    id = id.toUpperCase();
    id = id.replace( /\t/ , "T");
    id = id.replace( /\n/ , "N");
    id = id.replace( /\r/ , "R");
    id = id.replace( /\b/ , "B");
    id = id.replace( /\f/ , "F");
    return id.replace( /[^a-zA-Z0-9]/ , "");
}

có kết quả

Attempt 1: cleanID("\\test\red\bob\fred\new");
Output 1: "BTESTREDOBFREDNEW"

Bất kỳ trợ giúp sẽ được đánh giá cao.

Giải pháp làm việc:

Final Attempt 1: return JSON.stringify("\\test\red\bob\fred\new").replace( /\W/g , '');
Output 1: "testredbobfrednew"

Câu hỏi thú vị, \ n trong \ new rõ ràng là những gì vấp ngã này. Tôi không hoàn toàn chắc chắn làm thế nào để tìm và thay thế điều đó mặc dù đi tìm regex trên các ký tự đặc biệt của người da trắng
Will Buck

1
Là các đầu vào thoát / chúng được chỉ định như thế nào? var Input = "\\test\red\bob\fred\new"chuỗi này không chứa "màu đỏ" vì vậy lần thử đầu tiên của bạn là chính xác, bạn có đang thử nghiệm chống lại rác "\\\\test\\red\\bob\\fred\\new"không?
Alex K.

/[^\w\s]+/githử cái này.
Bartosz Grzybowski

Tôi đoán câu hỏi là, dấu gạch chéo ngược trong chuỗi đầu vào của bạn có đại diện cho các ký tự đặc biệt không? (Dựa trên đầu ra ví dụ của bạn, tôi đoán là không.)
Dave

Đã thử chuyển từ dấu ngoặc kép sang dấu ngoặc đơn?
OptimusCrime

Câu trả lời:


468

Xóa ký tự không chữ và số

Sau đây là / một biểu thức chính xác để loại bỏ các ký tự không chữ và số khỏi chuỗi đầu vào:

input.replace(/\W/g, '')

Lưu ý rằng \Wtương đương với [^0-9a-zA-Z_]- nó bao gồm ký tự gạch dưới. Để loại bỏ dấu gạch dưới, sử dụng, ví dụ:

input.replace(/[^0-9a-z]/gi, '')

Đầu vào không đúng định dạng

Vì chuỗi thử nghiệm chứa các ký tự thoát khác nhau, không phải là chữ và số, nên nó sẽ loại bỏ chúng.

Dấu gạch chéo ngược trong chuỗi cần thoát nếu nó được thực hiện theo nghĩa đen:

"\\test\\red\\bob\\fred\\new".replace(/\W/g, '')
"testredbobfrednew" // output

Xử lý các chuỗi không đúng

Nếu bạn không thể thoát chuỗi đầu vào một cách chính xác (tại sao không?) Hoặc nó đến từ một loại nguồn không đáng tin cậy / bị định cấu hình sai - bạn có thể làm một cái gì đó như thế này:

JSON.stringify("\\test\red\bob\fred\new").replace(/\W/g, '')
"testredbobfrednew" // output

Lưu ý rằng biểu diễn json của một chuỗi bao gồm các dấu ngoặc kép:

JSON.stringify("\\test\red\bob\fred\new")
""\\test\red\bob\fred\new""

Nhưng chúng cũng được loại bỏ bởi regex thay thế.


10
Điều này không loại bỏ dấu gạch dưới.
kylex

4
@kylex, đó là vì dấu gạch dưới được coi là một phần của bó chữ và số, vì một số lý do
Eugene Kuzmenko

12
"Bởi vì họ là những nhân vật thường hợp pháp trong các định danh biến." . Không có "_" trong câu hỏi, tất nhiên thay thế \Wbằng [_\W](được sử dụng trong câu hỏi) hoặc tương tự sẽ loại bỏ dấu gạch dưới.
AD7six

1
@ AD7six, bạn có thể giải thích rõ hơn về lý do tại sao một người nên sử dụng JSON.opesify () khi chuỗi đến từ một nguồn không đáng tin cậy không? Có bất kỳ mối quan tâm an ninh không làm như vậy? Cảm ơn!
jbmusso

1
@guithor Không phải là "người ta nên", hay nó ảnh hưởng đến an ninh; Nếu "một số chuỗi" đã được nhận được và vì lý do gì nó về cơ bản borked (Không rõ ràng từ câu hỏi tại sao các chuỗi được nhận bị thay đổi) - nó cho phép nhìn thấy những chuỗi cho những gì nó là: jsfiddle.net/Z6N7C
AD7six

49

Tất cả các câu trả lời hiện tại vẫn có những điều kỳ quặc, điều tốt nhất tôi có thể đưa ra là:

string.replace(/[^A-Za-z0-9]/g, '');

Đây là một ví dụ ghi lại mọi phím tôi có thể tìm thấy trên bàn phím:

var string = '123abcABC-_*(!@#$%^&*()_-={}[]:\"<>,.?/~`';
var stripped = string.replace(/[^A-Za-z0-9]/g, '');
console.log(stripped);

Đầu ra: '123abcABC'


1
input.replace(/\W/g, '')lá trong _một chuỗi. @Deminetix đúng string.replace(/[^A-Za-z0-9]/g, '');hoạt động tốt hơn vì nó loại bỏ tất cả các ký tự không chữ và số khỏi Chuỗi.
Tim

1
Tuy nhiên, không có hoán vị của câu trả lời này thực sự trả lời câu hỏi .
AD7six

10

Vấn đề không nằm ở cách bạn thay thế các ký tự, vấn đề là ở cách bạn nhập chuỗi.

Đó là chỉ dấu chéo ngược đầu tiên trong đầu vào đó là một nhân vật xuyệc ngược, những người khác là một phần của ký tự điều khiển \r, \b, \f\n.

Vì các dấu gạch chéo ngược đó không phải là các ký tự riêng biệt, nhưng là một phần của ký hiệu để viết một ký tự điều khiển duy nhất, chúng không thể bị xóa riêng. Tức là bạn không thể xóa dấu gạch chéo ngược \nvì đây không phải là hai ký tự riêng biệt, đó là cách bạn viết ký tự điều khiển LFhoặc nguồn cấp dữ liệu .

Nếu bạn thực sự muốn biến đầu vào đó thành đầu ra mong muốn, bạn sẽ cần thay thế từng ký tự điều khiển bằng chữ cái tương ứng, ví dụ thay thế ký tự \nbằng ký tự n.

Để thay thế một ký tự điều khiển, bạn cần sử dụng một bộ ký tự như [\r], \rcó ý nghĩa đặc biệt trong biểu thức chính quy:

var input = "\\test\red\bob\fred\new";

var output = input
    .replace(/[\r]/g, 'r')
    .replace(/[\b]/g, 'b')
    .replace(/[\f]/g, 'f')
    .replace(/[\n]/g, 'n')
    .replace(/\\/g, '');

Bản trình diễn: http://jsfiddle.net/SAp4W/


Tôi hiểu tất cả những gì bạn đang nói nhưng câu hỏi vẫn đứng vững và chưa có ai đề xuất câu trả lời đúng. Đầu vào có thể thay đổi nhưng không ai đề xuất câu trả lời về cách thay đổi lập trình trong JS.
Bobby Cannon

2
@BulkCannon: Tôi đã thêm mã lấy đầu vào chính xác của bạn và tạo đầu ra mong muốn.
Guffa

5

bạn có thể thử regex này:

value.replace(/[\W_-]/g, '');

cho mỗi câu hỏi: tôi chỉ muốn loại bỏ bất cứ thứ gì không phải là chữ và số. bạn mong đợi sản lượng gì?
myrcutio

0

Điều này loại bỏ tất cả các ký tự không chữ và số, giữ chữ viết hoa và giữ khoảng trắng giữa các từ.

function alpha_numeric_filter (string) {

  const alpha_numeric = Array.from('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + ' ')

  const json_string = JSON.stringify(string)

  let filterd_string = ''

  for (let i = 0; i < json_string.length; i++) {

    let char = json_string[i]
    let index = alpha_numeric.indexOf(char)
    if (index > -1) {
      filterd_string += alpha_numeric[index]
    }

  }

  return filterd_string

}

const input = "\\test\red\bob\fred\new"
console.log(alpha_numeric_filter(input)) //=> testredbobfrednew

const complex_string = "/_&_This!&!! is!@#$% a%^&*() Sentence+=-[]{} 123:;\|\\]||~`/.,><"
console.log(alpha_numeric_filter(complex_string)) //=> This is a Sentence 123

Điều đó không hiệu quả (vui lòng đọc câu hỏi) - Đó cũng là một cách làm khá phức tạp.
AD7six

1
@ AD7six cảm ơn bạn đã chỉ ra lỗi của tôi. Khi tôi sao chép đã dán đầu vào vào WebStrom, nó sẽ tự động thêm 2 dấu gạch chéo ngược vào mỗi dấu gạch chéo ngược hiện có. Tôi đã thất bại trong việc này. input = "\\ test \ red \ bob \ fred \ new" -> copy_paste = "\\\\ test \\ red \\ bob \\ fred \\ new".
Flavio

-1

Đây là một ví dụ mà bạn có thể sử dụng,

function removeNonAplhaNumeric(str){
    return str.replace(/[\W_]/g,"");
}

removeNonAplhaNumeric("0_0 (: /-\ :) 0-0");

-3

Nếu bạn muốn có \\test\red\bob\fred\newchuỗi này , bạn nên thoát tất cả dấu gạch chéo ngược ( \). Khi bạn viết \\test\\red\\bob\\fred\\newchuỗi của bạn thực sự chứa dấu gạch chéo ngược đơn. Bạn có thể chắc chắn về việc in chuỗi này của bạn.
Vì vậy, nếu dấu gạch chéo ngược trong chuỗi của bạn được thoát myString.replace(/\W/g,'')sẽ hoạt động bình thường.


1
Nếu bạn muốn đề xuất với "bạn nên thoát tất cả dấu gạch chéo ngược ()" thì bạn cần cung cấp một ví dụ về cách thực hiện.
Bobby Cannon

Điều gì làm bạn là dấu gạch chéo kép ??? và điều tôi muốn nói là "Khi bạn viết \ test \\ red \\ bob \\ fred \\ mới chuỗi của bạn thực sự chứa các dấu gạch chéo đơn." ??? Đây không phải là giải thích?
shift66

Đầu vào là "\ test \ red \ bod \ fred \ new" và không thể thay đổi. Tôi cần một giải pháp cho chuỗi đầu vào đó. Nếu bạn muốn chỉ cho tôi cách "trích xuất các dấu gạch chéo ngược" thì hãy đưa ra một ví dụ. Chúng tôi không thể thay đổi đầu vào. Xem câu trả lời được chấp nhận. Giải pháp cho phép đầu vào không thay đổi nhưng cho đầu ra mong muốn.
Bobby Cannon
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.