有没有更好的方法来清洗一个字符串?

4

目前这是我的代码。

function clean_string(raw_string) {
    A =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 1234567890".split(
            ""
        );
    var cleaned_string = raw_string.toLowerCase();
    for (i = 0; i < cleaned_string.length; i++) {
        if (!A.includes(cleaned_string[i])) {
            cleaned_string = setCharAt(cleaned_string, i, " ");
        }
    }
    cleaned_string = cleaned_string.replace(/\s\s+/g, " ");

    return cleaned_string;
}

function setCharAt(str, index, chr) {
    if (index > str.length - 1) return str;
    return str.substring(0, index) + chr + str.substring(index + 1);
}

我不懂正则表达式,但使用正则表达式可能会更容易。这是我想做的事情:
输入:Hello, David World 123! 输出:hello david world 123 基本上我想做的是将除a-z0-9以外的任何字符替换为一个空格,然后删除多余的空格,也就是说,我只想在结果中得到a-z0-9。如何做到呢?
注:代码可以运行,但我认为它看起来很糟糕而且效率不高。
编辑:抱歉,我的意思是我只想在输出中得到小写字母。我太蠢了。

您说您想要在输出中允许大写字母,然而,在所有提供的示例中,大写字母都被替换为小写字母。能否请您澄清一下? - fubar
@fubar 不好意思,我太蠢了。我已经修正了我的问题。我只需要小写字母。谢谢! - DavidNyan10
4个回答

2

一个简单的解决方案是将所有字符转换为小写字母,用空格字符替换任何不是 a-z、0-9 或空格的字符,然后用单个空格字符替换多个空格字符。

function sanitize(input) {
    return input
      .toLowerCase()
      .replace(/([^a-z\d\s]+)/g, ' ')
      .replace(/(\s+)/g, ' ');
}

console.log(sanitize('Hello, David World 123!'));
console.log(sanitize('hELlo.,     <>;dAVId  world  .;- 123'));
console.log(sanitize('He.llo     David,   w!orld 123#'));


为什么不直接删除有问题的字母,即用空字符串替换它们?这样就会减少需要删除的额外空格。 - daniel kullmann
@danielkullmann 这会使 He.llo 返回 hello 而不是 he llo,这不是我想要的。 - DavidNyan10

0
一个简单的正则表达式可以替换非字母数字字符,然后再使用另一个正则表达式去除连续多个空格即可解决问题。

const clean = (input) => {
  const alphanumeric = input.replace(/[^a-zA-Z0-9]/g, ' ')
  const spaceless = alphanumeric.replace(/\s{2,}/g, ' ')
  
  console.log(spaceless.toLowerCase())
  return spaceless.toLowerCase()
}

clean("Hello, David World 123!")
clean("hELlo.,     <>;dAVId  world  .;- 123")
clean("He.llo     David,   w!orld 123#   ")

当然,这个函数可以缩短为

const clean = (input) => {
  return input.replace(/[^a-zA-Z0-9]/g, ' ').
               replace(/\s{2,}/g, ' ').
               toLowerCase()
}

正则表达式解释:

[^a-zA-Z0-9]: 匹配任何不匹配 a-zA-Z0-9(任何非字母数字)的内容 \s{2,}: 匹配连续出现两次或更多次的空格字符


0

这里是使用正则表达式回调的一种方法:

var inputs = ["Hello, David World 123!", "hELlo.,     <>;dAVId  world  .;- 123", "He.llo     David,   w!orld 123#"];
for (var i=0; i < inputs.length; ++i) {
    var input = inputs[i];
    input = input.replace(/\w+/g, x => x.toLowerCase())
                 .replace(/[^\w_]+/g, " ");
    console.log(input);
}

这里的策略是进行两个正则表达式替换。第一个找到输入中的所有单词并将它们转换为小写。第二个然后剥离所有非单词字符和空格,包括下划线,并用一个空格替换。

0
您可以使用单个替换调用,仅将大写字符转换为小写,或者将一个或多个非单词字符替换为单个空格。
为了区分替换和小写,您可以在正则表达式中使用捕获组,并在回调函数中检查该组。
如果匹配组1,则存在一个或多个大写字母A-Z。

[
  "Hello, David World 123!",
  "hELlo.,     <>;dAVId  world  .;- 123",
  "He.llo     David,   w!orld 123#"
].forEach(s =>
  console.log(
    s.replace(/([A-Z]+)|[^\w_]+/g, (_, g1) => g1 ? g1.toLowerCase() : ' ')
  )
)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接