REGEX查找包含MySQL中打开和关闭括号的行

时间:2017-04-05 10:22:28

标签: mysql regex

我试过了:

....WHERE fieldname REGEXP '.*\(.*\).*';

但这会返回表格中的每条记录。

2 个答案:

答案 0 :(得分:1)

在REGEXP模式中转义正则表达式特殊元字符时,应使用双反斜杠。此外,由于REGEXP也找到了部分匹配,因此您不需要在开始/结束时使用.*

因此,您可以将表达式修复为

WHERE fieldname REGEXP '\\(.*\\)';

或者只使用LIKE %匹配任意数量的任意字符(但必须匹配整个条目,而不是REGEXP):

WHERE fieldname LIKE '%(%)%';

A MySQL fiddle

DROP TABLE IF EXISTS t;
CREATE TABLE t (word varchar(255));
INSERT INTO t (word)
VALUES
    ('test (here)'),
    ('test (here) test'),
    ('(here) test'),
    ('test no'),
    ('no test');

SELECT * FROM t WHERE word REGEXP '\\(.*\\)';

SELECT * FROM t WHERE word LIKE '%(%)%';

enter image description here

要获取text ) and ( here等条目,您可以使用

SELECT * FROM t WHERE word REGEXP '\\(.*\\)|\\).*\\(';

SELECT * FROM t WHERE word LIKE '%(%)%' OR word LIKE '%)%(%';

请参阅another fiddle

答案 1 :(得分:1)

LIKE比REGEXP更有效,但要以REGEXP术语回答......

我怀疑OP希望括号位于行文本的中间位置。

提供的REGEXP的问题是表达式是贪婪的。

。*完成匹配后,它已经吸收了整个记录。

尝试将前两个。*表达式设为[^(] (和[^)] )并删除最终的。*,因为它是多余的。

'[^\\(]*\\([^\\)]*\\)' 

基本上,这个表达式说

  • 查找零个或多个非(字符
    • 然后寻找一个(字符
    • 然后查找零个或多个非)字符
    • 然后寻找一个单一的角色

()可以是记录中的任何位置,并且()内可以包含零个或多个字符。

我可能会建议摆弄https://regex101.com/

希望这会有所帮助。