正则表达式用破折号、空格破折号、点空间、点和带有空字符串的撇号替换空格

Posted

技术标签:

【中文标题】正则表达式用破折号、空格破折号、点空间、点和带有空字符串的撇号替换空格【英文标题】:Regex to replace space with dash, spacedash, dotspace, dot and apostrophe with empty strings 【发布时间】:2021-09-13 02:02:02 【问题描述】:

我正在寻找一种更好的方法来编写以下 SQL 语句,无论是使用 REGEX 还是任何其他方式。

SELECT LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(SCHOOL_NAME, ' -', ''), '. ', ''), '''', ''), '.', ''), ' ', '-'))

我的意图是应用这些转换:

    用破折号代替空格

    用空字符串替换 SpaceDash

    用空字符串替换撇号

    用空字符串替换点空间

    用空字符串替换点

我正在处理的字符串示例包括双空格、撇号、破折号:

James valley court ad 

Saint's lee park school 

Harrison lodge - and  hospital 

我需要这些字符串变成这样:

james-valley-court-ad 

saints-lee-park-school 

harrison-lodge-and-hospital

【问题讨论】:

您介意将标题更新为不那么冗长但有意义的内容吗? 第一个替换是'space dash',第二个是'dot space';最后一个用破折号替换空格。这与您的项目符号列表有些不同。您是在寻找 Oracle 正则表达式还是其他一些正则表达式方言? @JeffHolt:原文在第四条规则中有“.Space”。我在第一次编辑中删除了点,但在第二次编辑中将其替换为“DotSpace”。原版是模棱两可的——所有其他字符都被拼出来了,Chrome(至少在我的 Mac 上)很容易在我不想要它们的地方添加点,我认为(我现在错误地认为)这是一个添加点而不是比一个没有拼出来的。 也许我在查询中遗漏了一些东西,但这个例子是我最后想要实现的 我认为更好的标题是“有没有更容易阅读和证明的表达式?”然后您可以引入正则表达式函数作为可能的解决方案。但这听起来有点像 XY 问题,因此您可以解释为什么需要进行转换。当然,整个问题最好发布在software engineering 站点或code review 站点。 【参考方案1】:

使用regexp_replace:

SELECT REGEXP_REPLACE(REPLACE(LOWER(SCHOOL_NAME), '''', ''), '[ .-]+', '-')

见live demo。


所有个非字母字符转换为连字符:

SELECT REGEXP_REPLACE(REPLACE(LOWER(SCHOOL_NAME), '''', ''), '[^a-z]+', '-')

见live demo。


这两个选项都会根据您的输入生成以下内容:

james-valley-court-ad
saints-lee-park-school
harrison-lodge-and-hospital

【讨论】:

非常有帮助,非常感谢 :)

以上是关于正则表达式用破折号、空格破折号、点空间、点和带有空字符串的撇号替换空格的主要内容,如果未能解决你的问题,请参考以下文章

REGEX 删除空格或破折号,如果它们在数字之间

带有 0 或 1 的正则表达式数字 - 后跟数字

PERL:用破折号读取社会保障号的正则表达式

JavaScript:正则表达式 CamelCase 到句子

正则表达式获取字符串的第一部分

如何编写正则表达式以仅匹配数字、字母和破折号?