0

我正在使用 Oracle REGEXP_REPLACE 从客户端用于存储数据的 CLOB 自由文本字段中删除所有非标准 ascii(特殊)字符,一些用户从 Excel 复制和粘贴,这会导致从 CLOB 读取文本时出现问题。我已经设法摆脱所有特殊字符并保持段落的布局等。

我遇到的问题是,当我将清理后的字段与原始字段进行比较时,当然在转换为 char 字符串之后,它是否返回了它们之间没有区别的行,我已经提取了两个值并且没有区别在大多数情况下。它正在返回整个数据集,而不仅仅是那些已被清理的数据集。我已经没有想法了

仅供参考,维护布局的很大一部分意味着我需要保留回车 CHR(13)

下面是查询

select *
from (
select incident, entity,
trim(to_char(textarea)) textarea,
trim(to_char(regexp_replace(textarea,'[^' || CHR(13) || CHR(32) || '-' || CHR(126) || ']',''))) regexp_text
from response
) tab
where tab.regexp_text <> tab.textarea

我尝试了许多不同的组合,包括修剪空白和子串较小的字符串等,但没有运气

4

3 回答 3

0
WITH data ( value ) AS (
  SELECT 'éklzéiuhkn' FROM DUAL
)
SELECT REGEXP_REPLACE( value, '[^\r -~]', '' )
FROM   data;

输出

REGEXP_R
--------
klziuhkn

所以你的查询应该是这样的:

SELECT *
FROM   (
  SELECT incident,
         entity,
         TRIM( textarea ) AS textarea,
         TRIM( REGEXP_REPLACE( textarea, '[^\r -~]', '' ) ) AS regexp_text
  FROM   response
)
WHERE textarea <> regexp_text;
于 2016-02-22T13:04:47.033 回答
0

我终于弄明白了,问题在于格式化where子句中的比较字符串以包含所有 Ascii 字符并匹配我计划使用的正则表达式,这是消除虚假和不可见编码字符的唯一方法。

select incident, entity,
regexp_replace(textarea,'[^' || CHR(13) || ' -}‘-~À-ü]',''))) regexp_text
regexp_replace(textarea,'[^' || CHR(13) || CHR(32) || '-' || CHR(125) || CHR(145) || '-' || CHR(152) || CHR(192) || '-' || CHR(252) || ']','') regexp_text2
from response
where to_char(regexp_replace(textarea,'[^' || CHR(163) || CHR(1) || '-' || CHR(125) || CHR(145) || '-' || CHR(152) || CHR(192) || '-' || CHR(252) || ']','')) <> to_char(regexp_replace(textarea,'[^' || CHR(1) || '-' || CHR(255) || ']',''))

我包括了这两行来显示简单的正则表达式'[^' || CHR(13) || ' -}‘-~À-ü]'以及CHR(x)版本。最后我还需要包含拉丁字符。

出于某种原因,在指定 ascii 字符 100% 的情况下仅使用 CHR(),我想这可能与环境 NLS_LANG 设置有关。

这应该适用于所有希望从字符串中排除奇怪编码字符的人

于 2016-02-24T16:19:22.240 回答
0

你的模式是: '[^' || CHR(13) || CHR(32) || '-' || CHR(126) || ']'.

插入符号 ( ^) 正在用空字符串替换不是特殊字符的所有内容。使用 Oracle 的默认设置,我希望这会返回空字符串,它被视为NULL- 但这意味着什么都不会返回。

无论如何,请尝试删除插入符号:

trim(to_char(regexp_replace(textarea, '[CHR(13) || CHR(32) || '-' || CHR(126) || ']',' '))) as regexp_text
于 2016-02-22T12:12:22.630 回答