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

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

问题是它将匹配“猫”和“李”(在龙里)。它应该只匹配标签号。
标签号的要求如下:
1-3个字符,它必须至少包含一个整数(0-9)
它可以出现在字符串中的任何位置
另外,我使用Postgres正则表达式,我认为它使用POSIX正则表达式。(http://www.postgresql.org/docs/9.3/static/functions-string.html

最佳答案

这在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()(不带“global”开关'g')对于作业比返回数组(即使是单个匹配项)的regexp_matches()更好。
substring()也快一点。
SQL Fiddle.

09-25 21:13