我想删除所有既不是下划线、连字符也不是字母数字的字符。此外,我不希望下划线或连字符作为第一个字符,因此也需要将其删除。
这似乎主要使用REGEXP_REPLACE和 LTRIM 工作:
SELECT LTRIM(
REGEXP_REPLACE(
'_-Hello(-)World)',
'[^-^_^a-z^A-Z^0-9]*',
''),
'_-') AS "result"
FROM dual;
这正确返回:
result
--------------------
Hello-World
但是,由于某种原因,当源字符串中有换行符时,这并不完全有效:
SELECT LTRIM(
REGEXP_REPLACE(
'_-Hello(-
)World)',
'[^-^_^a-z^A-Z^0-9]*',
''),
'_-') AS "result"
FROM dual;
这将返回“HelloWorld”,即没有连字符:
result
--------------------
HelloWorld
这个解决方案可能还有其他我忘记提及的问题。那么,有没有更好的方法来做我想做的事情?
选择零个或多个字符(第一个抑扬符)不是连字符、抑扬符(第二个)、下划线、抑扬符 (...)、a 到 z、抑扬符 (...)、A 到 Z、抑扬符(确定)或零到九。因此,如果您要使用包含抑扬符(而不是元音顶部)的文本进行测试,它肯定会保留,因为您多次坚持。
此外,如果您碰巧使用 SQL*Plus,一个有趣的特性是行继续字符、“-”或连字符。
或许阅读Continuing a Long SQL*Plus Command on Additional Lines。它解释了消失的连字符。