我正在尝试匹配猫列表中的标签号:
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中)。它应该只匹配标签号。
标签号的要求是:
作为旁注,我正在使用Postgres正则表达式,我认为它使用POSIX正则表达式。 (http://www.postgresql.org/docs/9.3/static/functions-string.html)
答案 0 :(得分:4)
您可以使用此正则表达式:
\b(?=\w*?\d)\w{1,3}\b
测试:使用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()
也快一点。