正则表达式没有空格
Posted
技术标签:
【中文标题】正则表达式没有空格【英文标题】:regexp no space 【发布时间】:2020-04-06 09:16:03 【问题描述】:正则表达式 [[:blank:]] 和 \s 不一样。 下面显示了 2 个不同的结果。
select regexp_replace('Greg94/Eric99Chandler/Faulkner','/','')
from dual
where regexp_like(trim('Greg94/Eric99Chandler/Faulkner'),'[^[[:blank:]]]');
上述查询不返回任何行,而当我用 [^/s] 替换空白时,它返回该行。
【问题讨论】:
你要匹配的模式是什么?例如,[^x]
匹配任何不是x
的字符。您真的要测试'Greg94/Eric99Chandler/Faulkner'
是否包含任何不是空白字符的字符,还是您真的要检查它是否包含任何空白?
我希望返回没有空格的字符串。在示例中,字符串没有空格,因此查询应返回该行。我使用了正确的语法,现在我明白了。谢谢
【参考方案1】:
问题在于您使用的是 [[:blank:]] 而不是 [:blank:]。 正则表达式 [^ [[:blank:]]] 评估:
-
^[[:blank:]] : 列表中没有字符“[, [:blank:]”
] 要评估的最后一个字符。
或者您删除最后一个字符 ']',它是不返回记录或更正表达式的字符: [^ [:空白:]]
[^\s] 是正确的。
【讨论】:
在正则表达式中 \s 和类 [:blank:] 不一样; \s 实际上对应于更具包容性的 POSIX 类 [:space:]。 [:blank:] 是空格和制表符; [:space:] 是空格、制表符、换页等。参见Oracle POSIX 和POSIX description。 是的,我没有另外说,[:blank:] 和 \s 不同,但不是因为查询有不同的结果。查询会产生不同的结果,因为其中一个查询使用了不正确的正则表达式。 你的角色类中有一个空格 -[: blank:]
应该是 [:blank:]
【参考方案2】:
那就是
SQL> SELECT regexp_replace('Greg94/Eric99Chandler/Faulkner','/','') as result
2 FROM dual
3 WHERE REGEXP_LIKE(TRIM('Greg94/Eric99Chandler/Faulkner'), '[^[:blank:]]');
RESULT
--------------------------------------------------
Greg94Eric99ChandlerFaulkner
SQL>
SQL> SELECT regexp_replace('Greg94/Eric99Chandler/Faulkner','/','') as result
2 FROM dual
3 WHERE NOT REGEXP_LIKE(TRIM('Greg94/Eric99Chandler/Faulkner'), '[[:blank:]]');
RESULT
--------------------------------------------------
Greg94Eric99ChandlerFaulkner
SQL>
SQL> SELECT regexp_replace('Greg94/Eric99Chandler/Faulkner','/','') as result
2 FROM dual
3 WHERE REGEXP_LIKE(TRIM('Greg94/Eric99Chandler/Faulkner'), '[^\s]');
RESULT
--------------------------------------------------
Greg94Eric99ChandlerFaulkner
SQL>
选择你最喜欢的一个。此外,如果你发现什么可行,为什么不简单地使用它(忘记那个不可行的)? (我想我知道 - 因为但是为什么???)。
【讨论】:
如果没有杂散的单引号弄乱 SO 格式,这可能更容易阅读。 对不起,@William,但是 - 我不明白你在说什么。有什么乱七八糟的?对我来说看起来不错(在我的笔记本上阅读)。 一个带引号的字符串从REGEXP_REPLACE('GREG94/ERIC9
(第一列标题)的中间开始,所以所有的引号突出显示在第二个标题的中间。
啊,突出显示!现在明白了,谢谢@William;固定。【参考方案3】:
也许更清晰的测试是生成一些包含各种空白字符的字符串,然后使用case
表达式来查看它们是否匹配不同的正则表达式。
with demo (str) as
( select ':' from dual union all
select 'a' from dual union all
select 'b' from dual union all
select 'c' from dual union all
select 'contains'||chr(9)||'tabs' from dual union all
select 'contains'||chr(10)||chr(13)||'linebreaks' from dual union all
select 'contains some spaces' from dual
)
select str
, case when regexp_like(str,'[:blank:]') then 'Y' end as "[:blank:]"
, case when regexp_like(str,'[[:blank:]]') then 'Y' end as "[[:blank:]]"
, case when regexp_like(str,'[[:space:]]') then 'Y' end as "[[:space:]]"
, case when regexp_like(str,'\s') then 'Y' end as "\s"
from demo
order by 1;
STR [:blank:] [[:blank:]] [[:space:]] \s
-------------------- --------- ----------- ----------- --
: Y
a Y
b Y
c
contains tabs Y Y Y
contains Y Y Y
linebreaks
contains some spaces Y Y Y Y
(我手动编辑了带有标签的行的结果以对齐结果,否则标签会弄乱它并使其更难阅读。)
[:blank:]
匹配任何:
、b
、l
、a
、n
、k
,因为字符类仅在[]
括号表达式中有效。
[[:blank:]]
只匹配空格。
[[:space:]]
匹配制表符、换行符、回车符和空格。
\s
与[[:space:]]
相同
至于您的示例,它在两种不同的方式上都没有按照您的预期表现。
首先,[^[[:blank:]]]
应该是 [^[:blank:]]
- 即括号表达式中的字符类 [:blank:]
。
其次,当没有空格时,更正的语法仍然返回匹配,因为它会查找任何不是空格的字符,例如第一个字符 G
不是空格,因此它匹配表达式:
regexp_like('Greg94/Eric99Chandler/Faulkner','[^ ]');
要识别不包含任何空白字符的字符串,您应该使用:
not regexp_like(str,'\s')
或
not regexp_like(str, '[[:space:]]')
【讨论】:
以上是关于正则表达式没有空格的主要内容,如果未能解决你的问题,请参考以下文章