MySQL正则表达式转义$

标签 mysql regex escaping wildcard

我写了一篇关于 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|domain\technical1971$

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

我已经尝试过:(不起作用)

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

and CS_USERNAME NOT REGEXP '\$' 

最佳答案

仅使用 LIKE 运算符怎么样:

WHERE CS_USERNAME NOT LIKE '%$'

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

WHERE CS_USERNAME NOT REGEXP '\\$$'

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

To use a literal instance of a special character in a regular expression, precede it by two backslash () characters. The MySQL parser interprets one of the backslashes, and the regular expression library interprets the other.

关于MySQL正则表达式转义$,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43091621/

相关文章:

python - 将所需数据从一个文件复制到python中的另一个文件

javascript - 如何维护 JSON 中的 <br/> 标签?

c++ - 如何使用\转义序列

java - 从输入中转义 unicode

mysql - Heroku 数据库 :push is not working

php - 在 PDO(使用 MySQL)中执行 INSERT 后获取最后插入的行?

php - 变量中无法识别下划线和破折号

C 字符串文字所需的转义字符

mysql - 最畅销的产品

mysql - SQL 操作数错误