使用Java Script清理字符串

3

我有一个小的Node脚本,用于网络爬虫一个网页。从该页面中,我提取了一个字符串数组。

我正在尝试清理这些字符串(目前使用正则表达式和string.replace)。

一个示例字符串看起来像这样:

2  Glücklich sind die,die seine Erinnerungen beachten,+die mit ganzem Herzen nach ihm suchen.+\n

我的清理代码如下所示。

string.replace(/\+/g, '').replace(/\*/g, '').replace('\n', '').replace(/(^\d+)/g, '').trim()

第一部分删除所有的"+", 第二部分删除所有的"*", 第三部分删除换行符, 最后一部分删除前导数字。
大部分工作良好,但我有一些边缘情况。这是我的结果:
2 Glücklich sind die,die seine Erinnerungen beachten,die mit ganzem Herzen nach ihm suchen.
问题:
1. 领先数字未被删除(当数字有两位或更多位时,它总是被删除,我不知道为什么一个数字保持不变)。 2. 第一个"*"被删除了,但因为没有空格,所以没有空格了。第二个"*"后面跟着一个空格...所以没有问题。 3. "+"也是同样的问题...没有空格跟随,所以单词粘在一起。
我的目标是正确解析每个字符串。我有成千上万个具有不同组合的字符串,但只有"+", "*", "\n"和数字作为特殊字符。
字符串应该像这样:
Glücklich sind die, die seine Erinnerungen beachten, die mit ganzem Herzen nach ihm suchen。
希望有人有想法来实现这一点。

^\d+ 模式应该替换单个数字...有可能有前导空格吗? 也许先尝试做 .trim()?此外,如果您知道 +/* 替换后应始终有空格,可以这样做:.replace(/\s*(\+|\*)\s*/g, ' ')。这样任何现有的空格都将随着 */+ 被移除,然后全部用一个空格替换。 - David784
哇,太棒了。将修剪放在最前面解决了数字替换的问题。也许像你说的那样有空格。而且没有分号;(一个“+”并不总是后跟空格;(。 - Cornelius
3个回答

2
您可以使用字符类[+*\n]的交替符|来匹配字符串开头的任意一个字符或1个或多个数字^\d+
[+*\n]|^\d+

正则表达式演示

在替换中使用一个空格。然后,将所有2个或更多空格替换为单个空格。

let pattern = /[+*\n]|^\d+/g;
let string = "2  Glücklich sind die,*die seine Erinnerungen* beachten,+die mit ganzem Herzen nach ihm suchen.+\n";
string = string
  .replace(pattern, " ")
  .replace(/[ ]{2,}/g, " ")
  .trim();

console.log(string);

如果字符串开头的数字可以由可选的空格字符前缀,您也可以通过匹配0+个除换行符以外的空格字符来匹配这些字符 ^[^\S\r\n]*\d+

let pattern = /[+*\n]|^[^\S\r\n]*\d+/g;
let string = "  2  Glücklich sind die,*die seine Erinnerungen* beachten,+die mit ganzem Herzen nach ihm suchen.+\n";
string = string
  .replace(pattern, " ")
  .replace(/[ ]{2,}/g, " ")
  .trim();

console.log(string);


1
你可以通过一个相对简短的正则表达式和一次调用 String.prototype.replace 来实现所有目标:

let cleanStr = str => str.replace(/^[0-9\s]*|[+*\r\n]/g, '');

console.log(cleanStr('2  Glücklich sind die,die seine Erinnerungen beachten,+die mit ganzem Herzen nach ihm suchen.+\n'));

这个正则表达式可以检测到^[0-9\s]*[+*\r\n],并将这些序列替换为空字符串。 ^[0-9\s]*会将字符串开头的任意数量的连续数字或空格字符替换掉。 ^[+*\r\n]会删除字符串中出现的任何"+"、"*"或换行符(包括在Windows环境中可能有意义的\r)。

是的,替换是有效的,但是使用您的解决方案后,逗号后面的空格丢失了。 - Cornelius
输入缺少空格。 - Gershom Maes
哦,这个位置的字符是 * 但是Markdown编辑器已经相应地格式化了文本... - Cornelius

0

也许是这个?

let str = `2  Glücklich sind die,*die seine Erinnerungen* beachten,+die mit ganzem Herzen nach ihm suchen.+\n`

str = str.replace(/[\*\+]/g," ")
         .replace(/^\d+(\s+)?/,"") // or add .trim()
         .replace(/\n?/,"")
         .replace(/\s{2,}/g," ")
console.log(str)


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