Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql postgres子字符串使用正则表达式拆分文本_Postgresql_Substring - Fatal编程技术网

Postgresql postgres子字符串使用正则表达式拆分文本

Postgresql postgres子字符串使用正则表达式拆分文本,postgresql,substring,Postgresql,Substring,我有下面的字符串模式,我想把文本分成4个字段 NIFTY,11100年6月21日CE-->NIFTY,11100年6月21日CE 在上面的字符串中,只有两种字符串格式是常量。例如:21JUN表示年份和月份,它是5个字符的常量表示。在此之前表示名称,该名称可以是任意数量的字符。我认为正则表达式将类似于([1-2][0-9])(一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月) 最后两个字符是常量,其值可以是PE | CE。介于21JUN和CE | PE之间的值表示履约价格

我有下面的字符串模式,我想把文本分成4个字段

NIFTY,11100年6月21日CE
-->
NIFTY,11100年6月21日CE

在上面的字符串中,只有两种字符串格式是常量。例如:21JUN表示年份和月份,它是5个字符的常量表示。在此之前表示名称,该名称可以是任意数量的字符。我认为正则表达式将类似于
([1-2][0-9])(一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月)

最后两个字符是常量,其值可以是
PE | CE
。介于21JUN和
CE | PE
之间的值表示履约价格,它始终是数字,但可以是任意位数


现在我想把它们分成4个字段,并努力获得正则表达式。是否有人熟悉此要求的Postgres命令?

您可以使用
选择regexp_匹配('NIFTY21JUN11100CE','^(\D+)(\D{2}[A-Z]{3})(\D+(PE|CE)$)

逐步:

^          Beginning of the string
(          start capture
\D+        more than zero non-digit chars
)          end capture
(          start capture
\d{2}      exactly 2 digits
[A-Z]{3}   exactly 3 chars in the range from A to Z
)          end capture
(          start capture
\d+        more than zero digit chars
)          end capture
(          start capture
PE|CE      one of 'PE' or 'CE'
)          end capture
$          end of the string

使用字符类
[1-2][0-9]
和交替
(一月|二月|…)
的问题中的年-月正则表达式稍微严格一点,也可以使用。

`SELECT regexp_match('NIFTY21JUN11100CE','^(\D+)(\D{2})(\w{3})(\D+)(\D+)(PE{CE)$)`@钳形我认为你的RE有点咄咄逼人,因为它返回5个字段而不是4个字段。节“(\d{2})(\w{3})”应该是(\d{2}\w{3})。非常感谢您的帮助和保护。是的,我能够将其放入数组的4个字段中,并在查询中进一步使用它们。干杯。@Belayer你当然是对的。