Regex 如何在这个正则表达式中允许连字符

Regex 如何在这个正则表达式中允许连字符,regex,Regex,我知道一些正则表达式,但这个对我来说太复杂了。 我所需要更改的是,它也允许使用一个连字符 replace(/[^\p{L}\s]+/gu, '') 你可以用 .replace(/^([^-]*-)|-/g, '$1').replace(/[^\p{L}\s-]+/gu, '') 它将保留输入字符串中的第一个-,以及任何Unicode字母(\p{L})和空格(\s),因为.replace(/^([^-]*-)|-/g,$1')将匹配并捕获从字符串开始到第一个--(使用

我知道一些正则表达式,但这个对我来说太复杂了。 我所需要更改的是,它也允许使用一个连字符

replace(/[^\p{L}\s]+/gu, '')
你可以用

.replace(/^([^-]*-)|-/g, '$1').replace(/[^\p{L}\s-]+/gu, '')
它将保留输入字符串中的第一个
-
,以及任何Unicode字母(
\p{L}
)和空格(
\s
),因为
.replace(/^([^-]*-)|-/g,$1')
将匹配并捕获从字符串开始到第一个
-
-(使用)之外的所有字符然后匹配字符串中的任何其他
-
,并用组1的值替换匹配项(如果
-
不是字符串中的第一个连字符,则该值为空)和
。替换(/[^\p{L}\s-]+/gu',)
将删除除字母、空格和连字符以外的任何一个或多个字符(只有在第一次更换后,才会保留第一个)

请参见下面的ECMAScript 2018+JS演示:


console.log(“12-3-**(b-b-b-b-b-b-b-b-b-b-b-b-b-b-b-b-b)***.”替换(/^([^-]*-)/g,$1')。替换(/[^\p{L}\s-]+/gu.)
谢谢Wiktor的回答!但我刚刚意识到了一个问题(是为了我的实现,而不是你的代码)。我确实想一个接一个地阻止连字符,但我仍然需要允许多个连字符。我正在使用它创建标签,就像这样,所以我需要允许像
google cloud firestore
这样的东西。你能告诉我如何更改吗?@Tsabary抱歉,我的详细信息太少了。“比如”可以通过
text.replace(/(\p{L}-)[^\p{L}\s]/gu,'$1')
实现。Stribizuw很抱歉带回了相同的一个,我原以为它能像我预期的那样工作,但刚刚发现它并不完全正确。所以我的示例的意思是,它应该允许多个连字符,它们只是不在单词之间(不是一个接一个,也不是一开始)。目前,这只允许我键入一个连字符,当我尝试在第二个单词后键入另一个连字符时,我就卡住了。如果可以的话,这真的会帮助我知道如何允许多个连字符。@Tsabary然后尝试
。replace(/^-+|({2,}/g,$1')。replace(/[^\p{L}\s-]+/gu)
太棒了,谢谢你,Wiktor,我真的很感谢你的帮助