我是正则表达的新手。我在SQL查询中使用正则表达式。并且希望显示包含以下内容之外的所有记录:字母数字字符,空格,字符串之间的连字符( - ),最后的点(。)和字符串之间。 我能够做到字母数字字符和空格。连字符和点都在制造问题。
例如:" first.name"," firstname。"不应该来,但" .firstname"应该进入结果。
"名字"不应该来,但" -firstname"和"名字 - "应该进入结果。
截至目前,我已经做到了这一点。
SELECT * FROM my_table WHERE column1 like '.%' or column1 like '-%' or
regexp_like(column1 ,'[^[:alnum:]^[:blank:]]');
以上查询的工作方式是它允许在字符串中的任何位置使用点和连字符。而不是我想要的地方,如上所述。
任何人都可以帮助我。
答案 0 :(得分:1)
我创建的表就像你的表和这句话
select * from tmp where x like '.%' OR x like '-%' or x like '%-';
完美无缺 - 只有。而且 - :)
答案 1 :(得分:1)
我确认Michal解决方案:
SELECT * FROM
(select 'first.name' x from dual
union all select 'firstname.' from dual
union all select '.firstname' from dual
union all select 'first-name' from dual
union all select 'firstname-' from dual
union all select 'firs#@tname' from dual
union all select 'firs tname' from dual
union all select '#@hh tname' from dual
union all select '-firstname' from dual
union all select 'firstname' from dual)
where x like '.%' OR x like '-%' or x like '%-'
or (regexp_like(x ,'[^[:alnum:]^[:blank:]]') and x not like '%-%' and x not like '%.%')
;
导致
.firstname
firstname-
firs#@tname
#@hh tname
-firstname
答案 2 :(得分:1)
我尝试了很多解决方案。最后,下面的内容正如我想要的那样。
SELECT * FROM my_table WHERE (INSTR(column1,'.', 1, 1))=1
or (INSTR(column1,'-', 1, 1))=1 or (INSTR(column1,'-', 1,1)=length(column1))
or (REGEXP_LIKE(column1,'[^[:alnum:]^[:blank:]-.]'));
答案 3 :(得分:1)
我相信这可以写成单个正则表达式而无需求助于LIKE
运算符:
SELECT * FROM mytable
WHERE REGEXP_LIKE(column1 ,'(^[.-]|-$)|[^a-zA-Z0-9 \t.-]')
这里正则表达式正在寻找符合以下模式的任何字符串:
.
或-
开头,或以-
a-zA-Z
)或数字(0-9
)或空格/制表符以外的字符(这是POSIX类[:blank:]
,而不是{{1 }}这是所有空格)或[:space:]
或.
。请参阅SQL Fiddle here。请注意,我使用了与接受的答案中相同的测试数据。