【问题标题】:MySQL regex escape $MySQL 正则表达式转义 $
【发布时间】:2017-03-29 10:58:52
【问题描述】:

我已经对来自 Microsoft IIS 服务器的日志文件进行了分析。 完整的日志被推送到 mysql 数据库。我表中的字段与日志中的字段完全相同。

CREATE TABLE `iis_logging` (
    `ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `DATE_TIME` DATETIME NULL DEFAULT NULL,
    `LOG_DATE` DATE NULL DEFAULT NULL,
    `LOG_TIME` TIME NULL DEFAULT NULL,
    `S_SITENAME` VARCHAR(255) NULL DEFAULT NULL,
    `S_COMPUTERNAME` VARCHAR(255) NULL DEFAULT NULL,
    `S_IP` VARCHAR(255) NULL DEFAULT NULL,
    `CS_METHOD` VARCHAR(255) NULL DEFAULT NULL,
    `CS_URI_STEM` TEXT NULL,
    `CS_URI_QUERY` TEXT NULL,
    `S_PORT` INT(11) UNSIGNED NULL DEFAULT NULL,
    `CS_USERNAME` VARCHAR(255) NULL DEFAULT NULL,
    `C_IP` VARCHAR(255) NULL DEFAULT NULL,
    `CS_VERSION` VARCHAR(255) NULL DEFAULT NULL,
    `CS_USER_AGENT` TEXT NULL,
    `CS_COOKIE` TEXT NULL,
    `CS_REFERER` TEXT NULL,
    `CS_HOST` TEXT NULL,
    `SC_STATUS` VARCHAR(255) NULL DEFAULT NULL,
    `SC_SUBSTATUS` VARCHAR(255) NULL DEFAULT NULL,
    `SC_WIN32_STATUS` VARCHAR(255) NULL DEFAULT NULL,
    `SC_BYTES` INT(10) UNSIGNED NULL DEFAULT NULL,
    `CS_BYTES` INT(10) UNSIGNED NULL DEFAULT NULL,
    `TIME_TAKEN` INT(11) UNSIGNED NULL DEFAULT NULL,
    PRIMARY KEY (`ID`),
    INDEX `date_key` (`LOG_DATE`),
    INDEX `DATE_URL` (`LOG_DATE`, `CS_URI_STEM`(30)),
    INDEX `URL` (`CS_URI_STEM`(100))
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=82749372
;

现在我写了一个查询来只获取该日志的某些部分:

select concat(LOG_DATE,' ', LOG_TIME) as VISIT_TS, CS_METHOD, CS_URI_STEM, CS_URI_QUERY, CS_REFERER, CS_USERNAME
from iis_logging 
where CS_USERNAME NOT REGEXP '-' and CS_USERNAME NOT REGEXP '_' 
order by LOG_DATE DESC , LOG_TIME DESC, CS_USERNAME DESC
limit 500

在 where 子句中,我想过滤用户名以摆脱技术用户。这个查询工作得很好。 但是一些技术用户仍然在我的结果中。他们的用户名以 $ 结尾。

例子:

0#.w|域\technical1971$

如何编写正则表达式来摆脱它们? 我想过滤现有的 $,因为我不想过滤固定名称。

我已经试过了:(不工作)

and CS_USERNAME NOT REGEXP '[.dollar-sign.]' 

and CS_USERNAME NOT REGEXP '\$' 

【问题讨论】:

    标签: mysql regex escaping wildcard


    【解决方案1】:

    只使用LIKE 运算符怎么样:

    WHERE CS_USERNAME NOT LIKE '%$'
    

    如果你想使用REGEXP,那么你需要用两个反斜杠转义$

    WHERE CS_USERNAME NOT REGEXP '\\$$'
    

    这将匹配字符串末尾的文字美元符号。来自MySQL documentation

    要在正则表达式中使用特殊字符的文字实例,请在其前面加上两个反斜杠 () 字符。 MySQL 解析器解释其中一个反斜杠,而正则表达式库解释另一个。

    【讨论】:

    • 有时很简单,使用like 运算符。谢谢
    【解决方案2】:
    where CS_USERNAME NOT REGEXP '-' and CS_USERNAME NOT REGEXP '_' 
    

    -->

    WHERE cs_username REGEXP '[^-_$]'
    

    但这假设$ 可能出现在名称中的任何位置。仅在最后:

    WHERE cs_username NOT REGEXP '[-_]|[$]$'
    

    注意事项:

    • - 必须在字符类的首位,否则表示范围。
    • [$] 是转义 $ 的替代方法——通过创建一个字符类。
    • 通过将所有内容放在一个 REGEXP 中,与使用 ANDOR 相比略有改进。

      按 LOG_DATE DESC、LOG_TIME DESC、CS_USERNAME DESC 排序

    需要

    INDEX(log_date, log_time, cs_username)
    

    【讨论】:

      猜你喜欢
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多