用于在猫列表中查找标签号的正则表达式

时间:2014-04-02 17:16:53

标签: regex postgresql

我正在尝试匹配猫列表中的标签号:

Abyssinian 987
Burmese a1a
Dragon Li 2B
987 Cat
cat 987 Toyger
cat A1A Siamese
1

猫列表的标签号码为:

987
a1a
2B
987
987
A1A
1

我尝试过使用正则表达式:

\b[0-9a-zA-Z]{1,3}\b

问题是它会匹配“cat”和“Li”(在Dragon Li中)。它应该只匹配标签号。

标签号的要求是:

  • 1-3个字符,必须至少包含一个整数(0-9)
  • 它可以出现在字符串中的任何位置

作为旁注,我正在使用Postgres正则表达式,我认为它使用POSIX正则表达式。 (http://www.postgresql.org/docs/9.3/static/functions-string.html

2 个答案:

答案 0 :(得分:4)

您可以使用此正则表达式:

\b(?=\w*?\d)\w{1,3}\b

Online Demo

测试:使用grep -P

grep -oP '\b(?=\w*?\d)\w{1,3}\b' file
987
a1a
2B
987
987
A1A
1

答案 1 :(得分:4)

这适用于PostgreSQL:

SELECT substring(cat FROM '\m(?=\w{0,2}\d)\w{1,3}\M') AS tag
FROM   cat;

\m\M .. beginning and end of a word.
(?=\w{0,2}\d) .. positive lookahead
\w{1,3} .. 1-3 word characters

假设每个字符串中只有一个匹配项,substring()(没有“全局”开关'g')对于作业而言比regexp_matches()更好,后者会返回数组(即使是一场比赛) substring()也快一点。

SQL Fiddle.