我看到了很多与此非常相似的问题,但他们无法完全收集我想要的内容。
我有一个在SQL字符串中查找PDO命名占位符的搜索系统。
PDO占位符可以是A-z
、0-9
或_
,并且始终以:
开头。然而,在某些情况下,还会出现自然使用:
(12:35
(的日期和时间值。
我需要检查以找到与PDO标准匹配的占位符,但这些占位符是,而不仅仅是数字。
我可以在一个Regex中完成吗?
我目前开发的正则表达式是:
/:(?:[A-Z_]*)(?=[0-9]*)/gmi
但是,当找到任何数字时,它都会被切断,请参阅下面的示例SQL:
SELECT name, horse, id, DATE_FORMAT(Nee.datetimed, '12:12:12 @ %D') as del_time
FROM members WHERE biztype LIKE CONCAT('%',:bizb,'%')
AND (locate LIKE '%hos%' OR locate LIKE '%all%')
AND bizcat LIKE CONCAT('%',:catb7,'%') ORDER BY `status` DESC, RAND()
我需要捕获:catb7
和:bizb
,但忽略时间值。
我上面的Regex捕获了:bizb
和catb
,但这个捕获是不正确的,因为它截断了7。
/:(?:[A-Z_]*(?:[0-9]*))/gmi
捕获不正确的:12
和:12
。
/:(?:[A-Z_]*)(?=[0-9]*)/gmi
也捕获:
,这是不正确的。
对捕获组的各种调整和更改似乎找不到正确的结果:查找:
:<any letter or number or underscore, any length, must contain at least one letter or underscore>
有效捕获:
:adbcd :5fedg :56_gt :der :9_6
无效捕获:
:12 :1 :%D [MySQL date formatting]
您可以使用
B:(?!d+b)w+
请参阅regex演示。
详细信息:
B
-非单词边界位置(字符串或非单词字符的开头必须立即出现在当前位置的左侧(:
-冒号(?!d+b)
-如果一个或多个数字后面紧跟着当前位置右侧的单词边界,则会导致匹配失败的负前瞻w+
-一个或多个单词字符(字母/数字/下划线(