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:我添加了一个结果为“单单元格”的解决方案。