正则表达式替换非单词字符除连字符外

8
我有一个正则表达式模式(\W|_)[^-],对于h_e.l_l.o - w_o.r_d不起作用(替换字符串是" ")。
它返回类似这样的东西:
h      w   

希望至少能看到类似这样的东西:
h e l l o - w o r d

如何替换所有非单词字符和下划线,但排除连字符符号(-)?

你使用什么编程语言? - Casimir et Hippolyte
@user2648694 当您回来时,请考虑检查下面的答案,如果它有效,请接受它。 - Wiktor Stribiżew
1个回答

15

如果要匹配除破折号(或连字符)以外的任何非单词字符,您可以使用

[^\w-]

然而,这个正则表达式并不匹配_

您需要一个反向字符类,可以匹配字母、数字和连字符以外的任何字符:

/[^-a-zA-Z0-9]+/

或(带有不区分大小写的修饰符):

/[^-a-z0-9]+/i

请查看演示

注意,在字符类的开头放置-,不需要转义。

您可以在末尾添加一个加号,以匹配所有连续的不想要的字符并一次性删除它们。

如果您想使模式支持Unicode(也就是说,在某些正则表达式中,如果您使用简写字符类并带有/或不带有某些标志,它们也将匹配所有Unicode对应项),您可以使用

/[^\w-]|_/

请查看正则表达式演示(或者/(?:[^\w-]|_)+/来捕获这些字符的整个块)。

在这里,[^\w-]匹配任何不是单词字符(字母、数字或下划线)的字符,第二个选择项_匹配下划线。


1
非常感谢 :) 这对我帮助很大。顺便说一句,实际上这个 [^a-zA-Z0-9-] 在所有需要的情况下都可以使用。 - user2648694
@user2648694:我更新了答案,并添加了描述和可能的变化。 - Wiktor Stribiżew

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