MySQL中正则表达式转义的奇怪行为
你能给我解释一下这种行为吗MySQL中正则表达式转义的奇怪行为,mysql,regex,Mysql,Regex,你能给我解释一下这种行为吗 mysql> SELECT *, ('http://www.thisisatest.es/?utm_source=xxxx&utm_term=&utm_campaign=xxxx&utm_medium=xxxx' REGEXP rule) r FROM containers_rules; +---------------------------------------------------------------------------
mysql> SELECT *, ('http://www.thisisatest.es/?utm_source=xxxx&utm_term=&utm_campaign=xxxx&utm_medium=xxxx' REGEXP rule) r FROM containers_rules;
+---------------------------------------------------------------------------------------+------+
| rule | r |
+---------------------------------------------------------------------------------------+------+
| ^http://www.thisisatest.es/\\?utm_source | 0 |
| ^http://www.thisisatest.es/\?utm_source | 1 |
+---------------------------------------------------------------------------------------+------+
5 rows in set (0.01 sec)
mysql> SELECT 'http://www.thisisatest.es/?utm_source=xxxx&utm_term=&utm_campaign=xxxx&utm_medium=xxxx' REGEXP '^http://www.thisisatest.es/\\?utm_source' r;
+---+
| r |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
我不明白为什么手动正则表达式比较需要两个“\”而动态正则表达式比较只需要一个“\”,否则它就不起作用了
我有点不知所措…您看到的结果集按原样显示列值(即,没有其他转义字符) 但是,字符串文字确实需要额外的反斜杠;例如,第二行的insert语句应该是:
INSERT INTO ... VALUES ('^http://www.thisisatest.es/\\?utm_source')
这与您的手动查询相匹配。使用
\?
将匹配文字问号。使用
\\?
将匹配反斜杠\
的零个或一个(?
)实例
至于您的编辑:
当您有^http://www.thisisatest.es/\?utm_source
存储在数据库行中,将按原样理解。当您使用
REGEXP'^http://www.thisisatest.es/\?utm_source'
,转义被替换,这意味着模式被解释为^http://www.thisisatest.es/?utm_source
,这是不正确的。(它搜索零或一个/
)实际上,手动正则表达式需要两个反斜杠。那么为什么选择'http://www.thisisatest.es/?utm_source=xxxx&utm_term=&utm_campaign=xxxx&utm_medium=xxxx“REGEXP”^http://www.thisisatest.es/\?utm_源'r代码>返回0?尝试执行选择'^http://www.thisisatest.es/\?utm_源'代码>然后您将看到它为什么不匹配。一旦将正则表达式加载到数据库中,它就不再将\?
解析为?
。我将编辑我的答案以详细说明。正则表达式是作为字符串还是正则表达式对象存储在数据库中的?如果它是一个字符串,则需要将其存储为\\?
,然后为编辑器“\\\?”
再添加一个字符串,对吗?