为什么我从正在运行regexp_replace的varchar字段中获取无效数字?

时间:2018-09-27 13:32:53

标签: sql oracle

SELECT REGEXP_REPLACE (FIRST, '[^a-zA-Z0-9]+', '', 'g')
  FROM example
 WHERE LAST LIKE '%Belanger%'

'first'是varchar2字段。我只是想从“第一个字段”中删除非字母数字字符。

3 个答案:

答案 0 :(得分:1)

where last LIKE 'Belanger'仅返回last等于"Belanger"的行。添加适当的通配符

WHERE last LIKE '%Belanger%'  -- contains 'Belanger'

WHERE last LIKE 'Belanger%'  -- starts with 'Belanger'

 WHERE last LIKE '%Belanger'  -- ends with 'Belanger'

或(不喜欢)

 WHERE last = 'Belanger'  -- equals 'Belanger'

看来regexp_replace的语法是错误的。语法:

REGEXP_REPLACE( string, pattern [, replacement_string [, start_position
                [, nth_appearance [, match_parameter ] ] ] ] )

最后一个参数是match_parameter,必须在start_positionnth_appearance之前。有效的匹配参数为(根据TechNet REGEXP_REPLACE Function):

  

'c'执行区分大小写的匹配。
  'i'执行不区分大小写的匹配。
  'n'允许句点字符(。)匹配换行符。
  默认情况下,句点是通配符。
  假设'm'表达式有多行,其中^是一行的开始,$是
的结尾   一行,无论这些字符在表达式中的位置如何。默认情况下,假定表达式为单行。
  'x'空格字符将被忽略。默认情况下,空格字符会像任何
一样进行匹配   其他字符。

但是,如果没有此'g'参数(无论打算做什么),这应该可以工作:

regexp_replace(first, '[^a-zA-Z0-9]+', '')

答案 1 :(得分:1)

您不需要在这个地方private static boolean test(List<String> actualList, List<String> expectedList) { Pattern p = Pattern.compile("\\s+"); Set<String> set = actualList.stream() .flatMap(p::splitAsStream) .collect(Collectors.toSet()); return expectedList.stream().allMatch(set::contains); } 。以下查询就足够了。在@kfinity提供的文档中进行检查

'g'

答案 2 :(得分:0)

尝试以下操作(将不在a-z0-9范围内的任何内容替换为null,从位置1开始,所有出现的情况,不区分大小写):

regexp_replace(first, '[^a-z0-9]+', '', 1, 0, 'i')

或这个(替换POSIX [:alnum:](字母数字)character class中的任何内容):

regexp_replace(first, '[^[:alnum:]]')