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

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

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

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

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

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

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

  1. SELECT '' REGEXP 'regexp-to-test'

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

  1. SELECT '' REGEXP <expression>

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

yhxst69z

yhxst69z1#

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

Part 1:shell中的模式:

Using this QA as a sourcethis one too

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

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

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

举例来说:

  1. CREATE TABLE my_patterns (
  2. patId int NOT NULL AUTO_INCREMENT,
  3. pattern varchar(255) NOT NULL,
  4. test varchar(50) NOT NULL,
  5. CONSTRAINT PK_patterns PRIMARY KEY ( patId ),
  6. CONSTRAINT CK_pattern_test CHECK ( REGEXP_LIKE( test, pattern ) = 1 )
  7. );
  8. INSERT INTO my_patterns ( pattern, test ) VALUES ( '\\d\\d\\d', '123' ); -- OK
  9. INSERT INTO my_patterns ( pattern, test ) VALUES ( '\\d\\w\\d', '1a3' ); -- OK
  10. INSERT INTO my_patterns ( pattern, test ) VALUES ( '][', 'aaa' ); -- fails due to invalid pattern

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

Live example

展开查看全部

相关问题