正则表达式没有空格

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:] 匹配任何:blank,因为字符类仅在[] 括号表达式中有效。

[[:blank:]] 只匹配空格。

[[:space:]] 匹配制表符、换行符、回车符和空格。

\s[[:space:]] 相同

至于您的示例,它在两种不同的方式上都没有按照您的预期表现。

首先,[^[[:blank:]]] 应该是 [^[:blank:]] - 即括号表达式中的字符类 [:blank:]

其次,当没有空格时,更正的语法仍然返回匹配,因为它会查找任何不是空格的字符,例如第一个字符 G 不是空格,因此它匹配表达式:

regexp_like('Greg94/Eric99Chandler/Faulkner','[^ ]');

要识别不包含任何空白字符的字符串,您应该使用:

not regexp_like(str,'\s')

not regexp_like(str, '[[:space:]]')

【讨论】:

以上是关于正则表达式没有空格的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式表示空格或者换行

正则表达式,检测字符串中没有空格

没有空格的 Oracle 正则表达式

用于匹配特殊字符的正则表达式没有空格或换行符

在 json 模式中使用正则表达式来验证没有空格的字符串?

Java 正则表达式 - 不能以斜杠或空格开始或结束,并且没有连续的斜杠