Regex 提取字符串中的所有数字
如何提取字符串中的所有数字 样本输入:Regex 提取字符串中的所有数字,regex,postgresql,Regex,Postgresql,如何提取字符串中的所有数字 样本输入: 7nr-6p 12c-18L 12nr-24L 11nr-12p 预期产出: {7,6} {12,18} {12,24} 等等 使用第一个测试仪测试以下各项,7nr-6p: select regexp_split_to_array('7nr-6p', '[^0-9]') AS new_volume from mytable; 给出:{7,“,”,6,“}//为什么数字只匹配返回空格? select regexp_matches('7nr-6p',
- 7nr-6p
- 12c-18L
- 12nr-24L
- 11nr-12p
- {7,6}
- {12,18}
- {12,24}
- 等等
7nr-6p
:
select regexp_split_to_array('7nr-6p', '[^0-9]') AS new_volume from mytable;
给出:{7,“,”,6,“}//为什么数字只匹配返回空格?
select regexp_matches('7nr-6p', '[0-9]*'::text) from mytable;
给出:{7}//为什么不继续执行此操作?
select regexp_matches('7nr-6p', '\d'::text) from mytable;
给出:{7}
select NULLIF(regexp_replace('7nr-6p', '\D',',','g'), '')::text from mytable;
给出:
7、、6、
您可以替换所有文本,然后拆分:
SELECT regexp_split_to_array(
regexp_replace('7nr-6p', '[a-zA-Z]', '','g'),
'[^0-9]'
)
这将返回
{7,6}
您可以替换所有文本,然后拆分:
SELECT regexp_split_to_array(
regexp_replace('7nr-6p', '[a-zA-Z]', '','g'),
'[^0-9]'
)
这将返回以下查询:
select regexp_split_to_array(regexp_replace('7nr-6p', '^[^0-9]*|[^0-9]*$', 'g'), '[^0-9]+')
AS new_volume from mytable;
“修剪”非数字的前缀和后缀,并按剩余的非数字拆分
给出:
{7}//为什么不继续执行此操作?
select regexp_matches('7nr-6p', '\d'::text) from mytable;
因为没有'g'
标志,正则表达式在第一次匹配时停止。
添加'g'
标志:
select regexp_matches('7nr-6p', '[0-9]*'::text, 'g') from mytable;
以下查询:
select regexp_split_to_array(regexp_replace('7nr-6p', '^[^0-9]*|[^0-9]*$', 'g'), '[^0-9]+')
AS new_volume from mytable;
“修剪”非数字的前缀和后缀,并按剩余的非数字拆分
给出:
{7}//为什么不继续执行此操作?
select regexp_matches('7nr-6p', '\d'::text) from mytable;
因为没有'g'
标志,正则表达式在第一次匹配时停止。
添加'g'
标志:
select regexp_matches('7nr-6p', '[0-9]*'::text, 'g') from mytable;
结果:
id | nr
----+----
1 | 7
1 | 6
2 | 12
2 | 18
3 | 12
3 | 24
4 | 11
4 | 12
id | nrs
----+-------
1 | 7,6
2 | 12,18
3 | 12,24
4 | 11,12
我想把它们放在一个细胞里,这样我就可以根据需要提取它们 结果:
id | nr
----+----
1 | 7
1 | 6
2 | 12
2 | 18
3 | 12
3 | 24
4 | 11
4 | 12
id | nrs
----+-------
1 | 7,6
2 | 12,18
3 | 12,24
4 | 11,12
小提琴
结果:
id | nr
----+----
1 | 7
1 | 6
2 | 12
2 | 18
3 | 12
3 | 24
4 | 11
4 | 12
id | nrs
----+-------
1 | 7,6
2 | 12,18
3 | 12,24
4 | 11,12
我想把它们放在一个细胞里,这样我就可以根据需要提取它们 结果:
id | nr
----+----
1 | 7
1 | 6
2 | 12
2 | 18
3 | 12
3 | 24
4 | 11
4 | 12
id | nrs
----+-------
1 | 7,6
2 | 12,18
3 | 12,24
4 | 11,12
dbfiddle这里有一个更健壮的解决方案
CREATE OR REPLACE FUNCTION get_ints_from_text(TEXT) RETURNS int[] AS $$
select array_remove(regexp_split_to_array($1,'[^0-9]+','i'),'')::int[];
$$ LANGUAGE SQL IMMUTABLE;
范例
select get_ints_from_text('7nr-6p'); -- 7,6
-- also resilient in situations like
select get_ints_from_text('-7nr--6p'); -- 7,6
这里有一个链接可以尝试
我觉得把这个功能包装成一个不可变的函数是明智的。这是一个纯函数,一个不会改变数据的函数,一个在给定相同输入的情况下返回相同结果的函数。标记为“不可变”的不可变函数具有性能优势
通过使用函数,我们还可以从抽象中获益。如果将来需要改进此功能,则有一个源需要更新
有关不可变函数的更多信息,请参见
这里有一个更强大的解决方案
CREATE OR REPLACE FUNCTION get_ints_from_text(TEXT) RETURNS int[] AS $$
select array_remove(regexp_split_to_array($1,'[^0-9]+','i'),'')::int[];
$$ LANGUAGE SQL IMMUTABLE;
范例
select get_ints_from_text('7nr-6p'); -- 7,6
-- also resilient in situations like
select get_ints_from_text('-7nr--6p'); -- 7,6
这里有一个链接可以尝试
我觉得把这个功能包装成一个不可变的函数是明智的。这是一个纯函数,一个不会改变数据的函数,一个在给定相同输入的情况下返回相同结果的函数。标记为“不可变”的不可变函数具有性能优势
通过使用函数,我们还可以从抽象中获益。如果将来需要改进此功能,则有一个源需要更新
有关不可变函数的更多信息,请参见
我想把它们放在一个单元格中,这样我就可以把它们提取出来needed@Growler:我添加了一个结果为“single cell”的解决方案。我希望将它们放在一个单元格中,以便将它们提取为needed@Growler:我添加了一个结果为“单单元格”的解决方案。