oracle替换逗号,但前提是后面没有空格

7kjnsjlb  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(636)

我正在寻找其他语言的例子,但我真的不懂正则表达式,所以很难转换成oracle语法。
我想我想使用regexp\u replace,我想用破折号替换逗号,但前提是逗号后面没有空格。例如:
餐桌树,树种,枫树
将替换第一个逗号,但不替换第二个:
餐桌树种,枫树
我可以做一个简单的regexp\u替换,但与我想要的正好相反:

REGEXP_REPLACE(FieldToChange, ', ', '-')

这和直接替换是一样的,我理解。

REGEXP_REPLACE(FieldToChange, ',[^ ]', '-')

它只抓取后面没有空格的逗号,但它也会抓取下一个字符,结果是:
桌上型树种,枫树
我正在阅读oracle文档,但和许多文档一样,在这些文档变得有意义之前,您需要理解很多内容。因此,我真的想要一个解释,而不是一个简单的答案(对于其他语言,我找到的其他答案只是给出了答案,这无助于我将其转换为oracle。)

xdnvmnnf

xdnvmnnf1#

你的正则表达式 REGEXP_REPLACE(FieldToChange, ',[^ ]', '-') 将逗号与 , 任何字符,除了 [^ ] 反括号表达式。匹配的文本替换为 - ,您的替换模式。
在regex中,一个没有跟在其他模式后面的位置通常是通过一个负的向前看(比如 (?! ) ). 但是,oracleregex引擎是基于posix的,不支持lookarounds。
您可以依靠以下捕获机制:

REGEXP_REPLACE(FieldToChange, ',([^ ])', '-\1')

现在, ([^ ]) 将除空格以外的任何字符捕获到组1中,您可以使用 \1 在替换模式中。 \1 是一个数字替换反引用。在你的模式中,最多可以有9个组,posix \1 -like pbackreferences不允许更多(来自 19 ).
如果还希望在字符串末尾匹配逗号,则需要在组中使用替代项:

REGEXP_REPLACE(FieldToChange, ',([^ ]|$)', '-\1')

这个 ([^ ]|$) 捕获组匹配除空格或字符串结尾以外的任何字符。你不能使用 [^ $] 因为 $ 在括号表达式中失去其字符串结束锚点的含义,并且 [^ $] 匹配除空格和美元符号以外的任何字符。

相关问题