PCRE 正则表达式捕获组可以是数字或字母,但不能只是数字



我看到了很多与此非常相似的问题,但他们无法完全收集我想要的内容。

我有一个在SQL字符串中查找PDO命名占位符的搜索系统。

PDO占位符可以是A-z0-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捕获了:bizbcatb,但这个捕获是不正确的,因为它截断了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+-一个或多个单词字符(字母/数字/下划线(

相关内容

最新更新