REGEXP 模式匹配
REGEXP Pattern matching
我想进行 regexpr 模式匹配,但我做不到。请帮忙。
我想评估将要插入到数据库中的值。我想执行如下检查。
只允许使用四个特殊字符和字母。不允许使用其他特殊字符。
四个字符是.
点,-
连字符'
撇号和</code>space</p>
<p>我的价值将满足以下条件。</p>
<ul>
<li>它只包含字母。</li>
<li>它包含字母和以上特殊字符的组合。</li>
<li>它只包含所有 space。</li>
<li>除了 spaces 不应该是简单的特殊字符如 <code>......
, ----------
, ''''''''
.
例如这些是有效的:
ORACLE
ORA..C L--E
''..O
O--...'''
这些都是无效的:
........
''''''''''
--------
ORACLE$
ORACL#E
使用正则表达式 ^( +|[A-Z '.-]*[A-Z][A-Z '.-]*)$
来匹配仅包含以下之一的字符串:
+
所有 space 个字符;或
[A-Z '.-]*[A-Z][A-Z '.-]*
零个或多个字母字符或特殊字符,然后是一个字母字符,然后是零个或多个字母字符或特殊字符。
像这样:
Oracle 设置:
CREATE TABLE data (
value VARCHAR2(100),
CONSTRAINT value__alpha_or_special_chr CHECK ( REGEXP_LIKE( value, '^( +|[A-Z ''.-]*[A-Z][A-Z ''.-]*)$' ) )
);
插入有效数据:
INSERT INTO data ( value )
SELECT q'!ORACLE!' FROM DUAL UNION ALL
SELECT q'!ORA..C L--E!' FROM DUAL UNION ALL
SELECT q'!'''..O!' FROM DUAL UNION ALL
SELECT q'!O--...''''!' FROM DUAL UNION ALL
SELECT q'! !' FROM DUAL
无效数据失败:
INSERT INTO data ( value )
SELECT q'!''''''''''!' FROM DUAL;
ORA-02290: check constraint (FIDDLE_TRJCYMMSYLSIPALCEYXD.VALUE__ALPHA_OR_SPECIAL_CHR) violated
INSERT INTO data ( value )
SELECT q'!--------!' FROM DUAL;
ORA-02290: check constraint (FIDDLE_TRJCYMMSYLSIPALCEYXD.VALUE__ALPHA_OR_SPECIAL_CHR) violated
INSERT INTO data ( value )
SELECT q'!ORACLE$!' FROM DUAL;
ORA-02290: check constraint (FIDDLE_TRJCYMMSYLSIPALCEYXD.VALUE__ALPHA_OR_SPECIAL_CHR) violated
INSERT INTO data ( value )
SELECT q'!ORACL#E!' FROM DUAL;
ORA-02290: check constraint (FIDDLE_TRJCYMMSYLSIPALCEYXD.VALUE__ALPHA_OR_SPECIAL_CHR) violated
查询:
SELECT * FROM data;
输出:
| VALUE |
| :----------- |
| ORACLE |
| ORA..C L--E |
| '''..O |
| O--...'''' |
| |
db<>fiddle here
我想进行 regexpr 模式匹配,但我做不到。请帮忙。
我想评估将要插入到数据库中的值。我想执行如下检查。
只允许使用四个特殊字符和字母。不允许使用其他特殊字符。
四个字符是.
点,-
连字符'
撇号和</code>space</p>
<p>我的价值将满足以下条件。</p>
<ul>
<li>它只包含字母。</li>
<li>它包含字母和以上特殊字符的组合。</li>
<li>它只包含所有 space。</li>
<li>除了 spaces 不应该是简单的特殊字符如 <code>......
, ----------
, ''''''''
.
例如这些是有效的:
ORACLE
ORA..C L--E
''..O
O--...'''
这些都是无效的:
........
''''''''''
--------
ORACLE$
ORACL#E
使用正则表达式 ^( +|[A-Z '.-]*[A-Z][A-Z '.-]*)$
来匹配仅包含以下之一的字符串:
+
所有 space 个字符;或[A-Z '.-]*[A-Z][A-Z '.-]*
零个或多个字母字符或特殊字符,然后是一个字母字符,然后是零个或多个字母字符或特殊字符。
像这样:
Oracle 设置:
CREATE TABLE data (
value VARCHAR2(100),
CONSTRAINT value__alpha_or_special_chr CHECK ( REGEXP_LIKE( value, '^( +|[A-Z ''.-]*[A-Z][A-Z ''.-]*)$' ) )
);
插入有效数据:
INSERT INTO data ( value )
SELECT q'!ORACLE!' FROM DUAL UNION ALL
SELECT q'!ORA..C L--E!' FROM DUAL UNION ALL
SELECT q'!'''..O!' FROM DUAL UNION ALL
SELECT q'!O--...''''!' FROM DUAL UNION ALL
SELECT q'! !' FROM DUAL
无效数据失败:
INSERT INTO data ( value )
SELECT q'!''''''''''!' FROM DUAL;
ORA-02290: check constraint (FIDDLE_TRJCYMMSYLSIPALCEYXD.VALUE__ALPHA_OR_SPECIAL_CHR) violated
INSERT INTO data ( value )
SELECT q'!--------!' FROM DUAL;
ORA-02290: check constraint (FIDDLE_TRJCYMMSYLSIPALCEYXD.VALUE__ALPHA_OR_SPECIAL_CHR) violated
INSERT INTO data ( value )
SELECT q'!ORACLE$!' FROM DUAL;
ORA-02290: check constraint (FIDDLE_TRJCYMMSYLSIPALCEYXD.VALUE__ALPHA_OR_SPECIAL_CHR) violated
INSERT INTO data ( value )
SELECT q'!ORACL#E!' FROM DUAL;
ORA-02290: check constraint (FIDDLE_TRJCYMMSYLSIPALCEYXD.VALUE__ALPHA_OR_SPECIAL_CHR) violated
查询:
SELECT * FROM data;
输出:
| VALUE | | :----------- | | ORACLE | | ORA..C L--E | | '''..O | | O--...'''' | | |
db<>fiddle here