我需要在PostgreSQL中构建一个查询,并且需要查找包含6位数字的所有文本条目(例如000999
,019290
,998981
,234567
等)。问题是在字符串的开头或结尾处不需要该数字。
我尝试过但没有工作:
[0-9]{6}
- 返回超过6位数字的部分(?:(?<!\d)\d{6}(?!\d))
- postgresql不了解lookbehind [^0-9][0-9]{6}[^0-9]
及其变体,但无济于事。构建我自己的Perl / C函数并不是一个真正的选择,因为我没有所需的技能。知道现在可以使用什么样的正则表达式或者目前无法使用的其他技巧?
修改
输入样本:
aa 0011527 /CASA
- &gt;应该返回NOTHING aa 001152/CASA
- &gt;应该返回001152
aa001152/CASA
- &gt;应该返回001152
aa0011527/CASA
- &gt;应该返回NOTHING aa001152 /CASA
- &gt;应该返回001152
答案 0 :(得分:5)
如果PostgreSQL支持单词边界,请使用\b
:
\b(\d{6})\b
修改强>:
PostgreSQL中的 \b
表示backspace
,因此它不是单词边界。
http://www.postgresql.org/docs/8.3/interactive/functions-matching.html#FUNCTIONS-POSIX-REGEXP但是,会向您解释您可以使用\y
作为单词边界,因为它意味着matches only at the beginning or end of a word
,所以
\y(\d{6})\y
应该有用。
\m(\d{6})\M
应该也可以。
PostgreSQL正则表达式中单词匹配的完整列表:
Escape Description
\A matches only at the beginning of the string (see Section 9.7.3.5 for how this differs from ^)
\m matches only at the beginning of a word
\M matches only at the end of a word
\y matches only at the beginning or end of a word
\Y matches only at a point that is not the beginning or end of a word
\Z matches only at the end of the string (see Section 9.7.3.5 for how this differs from $)
新修改:
根据您的编辑,您应该可以执行此操作:
(^|[^\d])(\d+)([^\d]|$)
答案 1 :(得分:0)
使用@ h2ooooooo提出的建议我设法创建以下查询:
SELECT cleantwo."ID",cleantwo."Name",cleantwo."Code"
FROM
(
SELECT cleanone."ID",cleanone."Name",unnest(cleanone."Code") as "Code" -- 3. unnest all the entries received using regexp_matches (get all combinations)
FROM
(
SELECT sd."ID", sd."Name", regexp_matches(sd."Name", '(^|[^\d])(\d+)([^\d]|$)')
as "Code"
FROM "T_SOME_DATA" sd
WHERE substring(sd."Name" from 1 for 15) ~('(^|[^\d])(\d+)([^\d]|$)') -- 1. get all data possible
) as cleanone
WHERE cleanone."Code" IS NOT NULL -- 2. get data where code IS NOT NULL (remove useless entries)
) as cleantwo
WHERE length(cleantwo."Code")=6 -- 4. get only the combinations relevant to my initial requirement (codes with length 6)<br/>
我花了很多时间才找到这个,所以我希望它可以在同样的情况下帮助其他人。祝你好运!