【问题标题】:REGEXP_SUBSTR: Need more precise regex codeREGEXP_SUBSTR:需要更精确的正则表达式代码
【发布时间】:2018-09-05 03:24:36
【问题描述】:

我正在尝试找到一种方法,让一个正则表达式代码仅获取 .(点)之前的 5 位数字。 我尝试了很多东西,但似乎无法获得 99999... 我想这样做添加任何其他参数。

SELECT regexp_substr('ffffffff-5fd1-456b-8f4c-4a6ecc3b7cba::11899999.99', '[118]\d+') 
  FROM DUAL;

我目前得到 1189999,当我执行 '[118]\d{5}' 或 '[118]\d{5}+' 时得到 118999...

帮助...请...谢谢。

【问题讨论】:

  • 正如我所说,我只需要能够使用 regexp_substr 函数的前 2 个参数。
  • 为什么只想使用函数的前两个参数?他们其他人有什么问题?显然,可以提取匹配'\d{5}\.'的子串,然后提取五位数字;两个函数调用而不是一个。但为什么?你没有告诉我们什么?

标签: regex oracle oracle11g regexp-substr


【解决方案1】:

您可以捕获点前的 5 位数字:

regexp_substr('ffffffff-5fd1-456b-8f4c-4a6ecc3b7cba::11899999.99', '(\d{5})\.', 1, 1, NULL, 1)

请参阅Oracle demo

(\d{5}) 是一个捕获组,匹配 5 个连续数字并将值存储在组 1 中,\. 只匹配一个点(作为上下文)。 regexp_substr 函数的最后一个参数是捕获组的编号(这里是唯一的第一个)。

【讨论】:

  • 我知道这行得通,但我需要一些不使用其他参数的东西。我需要将它完全包含在第二个论点中……不知何故。我们有几个正则表达式用于从字符串中取出某些部分。我的最终目标是制作一个包含正则表达式第二个参数的表,这样当我们进行新研究时,我们不必总是去编辑存储过程。我们有一个新的研究,参考代码的新格式需要被解析到不同的部分......
  • @MacWilson08 - 这没有任何意义。如果必须将函数属性存储在表中,则存储所有属性的值。最后一个可以是NULL,不需要的时候;在这种情况下,它应该是1
  • @MacWilson08 您只能使用环视(在 Oracle 正则表达式中不可用)或使用消费模式来设置上下文,同时捕获您需要获取的内容(因此,捕获组编号参数是必须的)。跨度>
  • @WiktorStribiżew,如果我还必须存储其他参数,那将是一个宽表。我有 2 种不同类型的代码必须从一个字符串中解析。这需要重新考虑......
  • 绝对不是正确的生产方式,但同时为了让您在重新设计时完成工作,您能否将您的第二个参数与其他 args 一起像"'(\d{5})\.', 1, 1, NULL, 1" 一样?这假设您正在代码中动态构建对 REGEXP_SUBSTR 的调用。
猜你喜欢
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
相关资源
最近更新 更多