我试过了:
....WHERE fieldname REGEXP '.*\(.*\).*';
但这会返回表格中的每条记录。
答案 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 '%(%)%';
要获取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/
希望这会有所帮助。