MySQL 正则表达式转义 $
MySQL regex escape $
我已经对来自 Microsoft IIS 服务器的日志文件进行了分析。
完整的日志被推送到 mysql 数据库。我的 table 的字段与日志中的字段完全相同。
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$
如何编写 REGEX 来摆脱它们?
我想过滤现有的 $,因为我不想过滤固定名称。
我已经试过了:(不工作)
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.
where CS_USERNAME NOT REGEXP '-' and CS_USERNAME NOT REGEXP '_'
-->
WHERE cs_username REGEXP '[^-_$]'
但这假设 $
可能出现在名称中的任何位置。仅在最后:
WHERE cs_username NOT REGEXP '[-_]|[$]$'
备注:
-
必须在第一个字符class中,否则表示一个范围。
[$]
是转义 $
的替代方法——通过创建字符 class.
通过将所有内容都放在一个 REGEXP
中,与使用 AND
或 OR
.
相比,略有改进
按 LOG_DATE DESC 排序,LOG_TIME DESC,CS_USERNAME DESC
需要
INDEX(log_date, log_time, cs_username)
我已经对来自 Microsoft IIS 服务器的日志文件进行了分析。 完整的日志被推送到 mysql 数据库。我的 table 的字段与日志中的字段完全相同。
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$
如何编写 REGEX 来摆脱它们? 我想过滤现有的 $,因为我不想过滤固定名称。
我已经试过了:(不工作)
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.
where CS_USERNAME NOT REGEXP '-' and CS_USERNAME NOT REGEXP '_'
-->
WHERE cs_username REGEXP '[^-_$]'
但这假设 $
可能出现在名称中的任何位置。仅在最后:
WHERE cs_username NOT REGEXP '[-_]|[$]$'
备注:
-
必须在第一个字符class中,否则表示一个范围。[$]
是转义$
的替代方法——通过创建字符 class.通过将所有内容都放在一个
相比,略有改进REGEXP
中,与使用AND
或OR
.按 LOG_DATE DESC 排序,LOG_TIME DESC,CS_USERNAME DESC
需要
INDEX(log_date, log_time, cs_username)