正则表达式:去除所有非字母和'[单引号]

4
我该如何修改这个正则表达式以从字符串中删除除字母和 "(单引号)" 外的所有内容?
pattern = /\b(ma?c)?([a-z]+)/ig;
  1. 这个模式去掉不必要的空格,将第一个字母大写,其余字母转换为小写。
  2. 通过字母,我指的是英文中的a-z这些字母。

2
什么是字母表?比如拉丁字母表、希腊字母表、西里尔字母表?这是传统的7位数据,还是实际上采用了Unicode,而现在网络中超过80%的内容都采用了Unicode? - tchrist
2
你当前的正则表达式是关于什么的?更具体地说,\b(ma?c)? 如何与你的需求相关? - pimvdb
1个回答

8

删除字符,你需要使用实际执行此操作的某些函数,例如字符串 replace 函数(可以将正则表达式作为“from”参数接受)。

然后,您就可以处理普通应用程序中的字符类别,在 JavaScript(以及大多数其他正则表达式变体)中,它使用 [...] 来描述,其中 ... 是应该在类别中的内容。您可以在开头使用 ^ 来翻转类别的含义:

在您的情况下,可能是这样的:

str = str.replace(/[^A-Za-z']/g, "");

...这将替换除英文字母 A-Z(ABCDEFGHIJKLMNOPQRSTUVWXYZ)、a-z(abcdefghijklmnopqrstuvwxyz)和单引号之外的任何内容,使其为空(例如,删除它)。

let str = "This is a test with the numbers 123 and a '.";

console.log("before:", str);
str = str.replace(/[^A-Za-z']/g, "");
console.log("after: ", str);

然而,请注意,未在英语中使用的字母字符将不会被接受,在Web上使用的各种语言中有很多这样的字符(甚至在英语中,“借来”的词汇如“voilà”和“naïve”中也出现了许多这样的字符)。
你说你只需要英语A-Z,但对于其他人来说:在支持ES2018及以上版本的Unicode属性匹配的环境中,你可以使用\p {Alpha}属性代替仅使用A-Z来处理任何被认为是“字母”的内容。 \ p意味着“匹配此Unicode属性”(像往常一样,小写版本\ p意味着“匹配”,大写版本\ P意味着“不匹配”),而{Alpha}则表示“字母”:
str = str.replace(/[^\p{Alpha}']/gu, "");

(请注意,再次强调,\p{Alpha} 意味着“字母”,但因为它在否定字符类中,我们排除了字母字符。)
请注意,上面的代码中有 u 标志,以启用较新的 Unicode 功能。这也处理了 “voilà” 和 “naïve” 示例:

let str = "This is a test with the numbers 123 and a ' and voilà and naïve.";

console.log("before:", str);
str = str.replace(/[^\p{Alpha}']/gu, "");
console.log("after: ", str);


2
OP说“除了”,所以应该是/ [^A-Za-z'] /g吗? - Brigand
@FakeRainBrigand: 谢谢! 我漏掉了“除了”这个词!已经修复。 - T.J. Crowder
如何删除单引号,但保留在单词开头和结尾的单引号。例如,在句子“what's that, 'large' or not”中,我想删除第一个单引号,但保留'large'中的那个不变。 - dragonfly02
工作完美。谢谢。 - Or Assayag

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