对不起,但这很可能只是另一个“我的regEx中的错误在哪里?” - 问题,在我尝试确定地址表中所有行的“添加到门牌号码”的格式“不对。
我想找到所有行,其中的值违反了给定的要求:
示例:在结果中应该有行,其中cols值
有效结果是-1
,A
,Haus 1
,(Gebäude 1)
等字符串。
为此我做了fowolling查询:
SELECT *
from table
WHERE col is not null
AND NOT REGEXP_LIKE (col, 'my_reg_ex_see_below');
我尝试了以下正则表达式^([\S])([.]{0,18}[\S]{1}})+$
,它应该确保:
但是在我的结果中,所有行都返回,这不是NULL。
然后我尝试了这个正则表达式^([-0-9a-zA-Z])([-0-9a-zA-Z()\s]{0,18})([-0-9a-zA-Z\(\)]{0,1})$
(我知道它太强了,因为它只允许asci字母)但即便如此,我仍然会得到错误的结果。我在结果中得到以下三行
(Gebäude A)
和Haus 1
auch
(因为有一个尾随空格,结果正确)那么如何修复我的正则表达式只能获得col不能满足上述要求的正确行。注意:也必须接受德语字母和paranthes之类的东西。
答案 0 :(得分:3)
请注意,将速记字符类放入括号表达式时,会将其解析为字母和反斜杠模式。 [\S]
匹配S
和\
个字符。 [.]
始终匹配一个点(即它与\.
相同)。只在需要指定特定字符类时使用括号表达式(然后在其中使用POSIX字符类,例如[:space:]
用于空格)。
您可以使用
^\S(.{0,18}\S)?$
请参阅regex demo
<强>详情
^
- 字符串开头\S
- 非空白(.{0,18}\S)?
- 可选序列
.{0,18}
- 任意0到18个字符\S
- 非空白字符$
- 字符串结束。答案 1 :(得分:3)
[\S]
匹配\
字符或S
字符。
查询1 :
WITH data( str, name ) AS (
SELECT ' ', 'space' FROM DUAL UNION ALL
SELECT '\', 'slash' FROM DUAL UNION ALL
SELECT 's', 's' FROM DUAL UNION ALL
SELECT 'S', 'S' FROM DUAL UNION ALL
SELECT 'n', 'n' FROM DUAL UNION ALL
SELECT CHR(13), 'CR' FROM DUAL UNION ALL
SELECT CHR(10), 'LF' FROM DUAL
)
SELECT *
FROM data
WHERE REGEXP_LIKE( str, '[\S\n]' )
<强> Results 强>:
| STR | NAME |
|-----|-------|
| \ | slash |
| S | S |
| n | n |
因此,在上面的示例中,[\S\n]
与非空白字符或回车字符不匹配,而是匹配\
,S
或n
个字符
你只需要:
SELECT *
from table
WHERE REGEXP_LIKE (col, '^\S(.{0,18}\S)?$');
正则表达式^\S(.{0,18}\S)?$
将匹配:
^
字符串的开头\S
非空白字符( )?
一个可以匹配零次或一次的捕获组,其中包含:
.{0,18}
0到18个其他字符之间(规则 - 可以在第一个和最后一个字符之间包含任何字母,包括常规空格)\S
非空白字符$
字符串的结尾。