1

常规正则表达式:

foo(\((\d{1}|\d{2}|\d{3})\))?

这个正则表达式在 Java 中工作:

foo(\\((\\d{1}|\\d{2}|\\d{3})\\))?

例子:

fooa      //no match
foo(1)a   //no match
foo(a)    //no match
foo(1)    //match
foo(999)  //match
foo       //match

MySQL 5.5 文档(https://dev.mysql.com/doc/refman/5.5/en/regexp.html)说

Note:
Because MySQL uses the C escape syntax in strings (for example, “\n” to
represent the newline character), you must double any “\” that you use 
in your REGEXP strings.

我尝试在 MySQL 5.x 上运行以下测试

select 'foo' REGEXP 'foo(\\((\\d{1}|\\d{2}|\\d{3})\\))?'

这是我收到的错误消息:

Error: You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to
use near ''foo(\\([(]\\d{1}' at line 1

我查看了Adapting a Regex to work with MySQL并尝试了用 [0-9] 替换 \d{1} 等的建议,这给了我:

select 'foo' REGEXP 'foo(\\(([0-9]|[0-9]|[0-9])\\))?'

但仍然让 MySQL 死亡。

4

2 回答 2

1

没有立即可用的 MySQL 控制台来验证,这应该可以工作:

'foo\\([:digit:]{1,3})\\)?'

(123)您的其他正则表达式在 foo和 foo( )周围都有捕获组123。看起来您不想要 MySQL 中的捕获组(它甚至支持它们吗?),这会导致 MySQL 窒息。

于 2013-05-18T00:25:22.720 回答
1

突然出现,因为我遇到了这个并找到了问题/解决方案。

转到全局首选项-> MySQL 选项卡。在“使用自定义查询标记器”下有一个“过程/功能分隔符”。如果那是“|” 将其更改为其他内容(例如“/”)。这就是导致 SQuirreL 无法解析 REGEX 的原因。

于 2016-10-28T18:18:05.513 回答