在MySQL中查找包含无效正则表达式的行

yftpprvb  于 2023-10-15  发布在  Mysql
关注(0)|答案(1)|浏览(129)

我有一个表,其中一列包含用于匹配其他表中的行的正则表达式。然后我需要这样查询

SELECT st.id
FROM some_table st
WHERE '1234' REGEXP st.regexp;

只要列regexp包含有效的表达式或null,查询就可以正常运行。但是,如果任何一行中有无效的regexp,整个查询就会失败,并出现错误3685。这样就几乎不可能找到错误在哪里,因为没有验证正则表达式的函数。类似VALID_REGEXP()的东西可以解决这个问题,如下所示

SELECT *
FROM some_table st
WHERE NOT VALID_REGEXP(st.regexp);

我正在通过执行以下操作来验证安装/更新

SELECT '' REGEXP 'regexp-to-test'

但是,如果一个无效的表达式找到了它的方式,没有办法在数百万行中找到它,因为你必须一个接一个地测试它们,并寻找错误3685。
关于如何在一个查询中找到regexp列中包含无效正则表达式的所有行,有什么提示吗?

SELECT '' REGEXP <expression>

将让我知道是否有效,因为它将返回一行,而如果失败,它将返回错误3685。但是,逐行测试并不是一种选择,因为有大量的行需要测试。

yhxst69z

yhxst69z1#

因为MySQL没有内置的正则表达式验证器函数,你需要使用类似shell脚本的东西来测试和报告表中的所有正则表达式模式-但是在你这样做之后,你可以通过添加一个CHECK约束来防止将来发生这种情况,该约束针对存储在同一行中的已知匹配(或已知不匹配)运行存储的正则表达式模式:如果它是一个无效的正则表达式,那么CHECK约束将失败,从而防止将来在表中存储无效的模式。

Part 1:shell中的模式:

Using this QA as a sourcethis one too

mysql -e "SELECT pattern FROM my_patterns" | while read pattern; do
    
    echo "foobar" | grep "^${pattern}"

done

您需要根据每个grep的运行情况手动更新数据。

Part 2:防止无效模式被CHECK约束存储:

举例来说:

CREATE TABLE my_patterns (
  patId   int          NOT NULL AUTO_INCREMENT,
  pattern varchar(255) NOT NULL,
  test    varchar(50)  NOT NULL,
  
  CONSTRAINT PK_patterns PRIMARY KEY ( patId ),
  
  CONSTRAINT CK_pattern_test CHECK ( REGEXP_LIKE( test, pattern ) = 1 )
);

INSERT INTO my_patterns ( pattern, test ) VALUES ( '\\d\\d\\d', '123' ); -- OK

INSERT INTO my_patterns ( pattern, test ) VALUES ( '\\d\\w\\d', '1a3' ); -- OK

INSERT INTO my_patterns ( pattern, test ) VALUES ( '][', 'aaa' ); -- fails due to invalid pattern

架构错误:检查约束'CK_pattern_test'被违反。

Live example

相关问题