【问题标题】:regex capture group help netsuite/oracle正则表达式捕获组帮助 netsuite/oracle
【发布时间】:2019-11-14 16:04:06
【问题描述】:

我在 regex101 上玩了一段时间,但无法弄清楚,这可能是因为 NetSuite 中使用的 regex 版本。在 regex101 上使用下面的字符串突出显示我想要作为第 1 组的部分,但在 NetSuite 中没有任何结果。

我试过了:(?:,[^,]+,?){2}(,[^,]+,?) 尝试从该数据集中获取第 3 个和第 4 个逗号之间的值:

+000000006 06:23:15.291450,W-CHEVLPFULL-LP | ,+000000006 06:23:15.291450,W-CHEVUS | ,
+000000044 08:09:52.291450,W-ADITIVOSSM-SM | KM8014,+000000044 08:09:52.291450,W-CHEVLPFULL-LP | KM8014,
+000000125 00:53:18.291450,W-ADITHPSMFULL-HP-SM | ,+000000125 00:53:18.291450,W-ADITIVOSSM-SM | ,
+000000138 05:08:01.291450,W-ADITHPSMFULL-HP-SM | KM8512,+000000138 05:08:01.291450,W-EMPTYAVAILABLE | KM8512,
+000000138 05:20:45.291450,W-ADITIVOSSM-SM | ,+000000138 05:20:45.291450,W-EMPTYAVAILABLE |

应该是:

W-CHEVUS | 
W-CHEVLPFULL-LP | KM8014
W-ADITIVOSSM-SM | 
W-EMPTYAVAILABLE | KM8512
W-EMPTYAVAILABLE |

我尝试了其他“非捕获组”,但结果很奇怪,这让我认为它不受支持,或者我使用不正确。

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • Netsuite 中的正则表达式是什么?那里有什么方法可以让您访问群组吗?试试(?<=^(?:[^,]*,){3})[^,]+
  • 我猜它是 oracle 数据库使用的任何东西。我正在调用 REGEXP_SUBSTR( ) 函数。搜索将我带到这里:docs.oracle.com/cd/B19306_01/server.102/b14200/functions131.htm
  • 如果是Oracle,使用REGEXP_SUBSTR(col, '^([^,]*,){3}([^,]+)', 1, 1, NULL, 2)
  • 上下文是什么?数据来自哪里?如果这发生在套件脚本中,那么什么类型的脚本?我问是因为您粘贴的数据不是我所知道的任何自然 Netsuite 数据格式。

标签: regex netsuite


【解决方案1】:

我的猜测是这个表达式可能会返回所需的数据:

.+?,.+?,.+?,(.+?)(?:\s*,|\s*$)

DEMO

【讨论】:

  • 谢谢,这组在第 2 和第 3 个逗号之间,而不是第 3 和第 4 个,所以我将它切换为 .+?,.+?,.+?,(.+) 这里的问题是它实际上选择了我想要的倒数。有什么想法吗?
【解决方案2】:

在最复杂的情​​况下,您可以使用:

^([^,]*),([^,]*),([^,]*),([^,]*),?$

然后您可以使用\1\2\3\4 访问您想要的任何字段。

测试here


如果所有内容都在一行上,那么您需要字符串中的每四个元素。

更新后的正则表达式为:

[^,]*,[^,]*,[^,]*,([^,]*),?

使用\1 获取您的字符串。

测试here

当然,我不知道你的具体工具的特殊性,所以我不能“补偿”它们。

【讨论】:

  • 我真的很喜欢这个解决方案的想法,在测试中第四组正是我想要的。当我在演示或应用程序中尝试 \4 时,它没有给我任何结果,所以这可能不适用于这种正则表达式?
  • 从更多的练习来看,看起来它正在返回第一个“完全匹配”是什么,但添加不同的反向引用确实会改变结果。我还意识到开头有 ^ 结尾有 $,返回的实际字符串是一行,为了便于阅读,我在示例中将其设为多行 oops。
【解决方案3】:

由于您实际上是在幕后使用 Oracle,因此您可能会使用

REGEXP_SUBSTR(col, '^([^,]*,){3}([^,]+)', 1, 1, NULL, 2)

regex demo

详情

  • ^ - 字符串开头
  • ([^,]*,){3} - 组 1 的三个匹配项匹配除 , 之外的任何 0 个或多个字符,然后是 ,
  • ([^,]+) - 第 2 组匹配除 , 之外的一个或多个字符。

最后一个2 参数表示只返回第2组值。

【讨论】:

    【解决方案4】:

    也许您可以使用单个捕获组和锚点来断言字符串的开头。您的价值将在第一个捕获组中

    ^[^,]+(?:,[^,]+){2},([^,]+)
    
    • ^ 字符串开始
    • [^,]+ 匹配 1+ 次而不是逗号
    • (?:,[^,]+){2} 重复 2 次匹配逗号,然后 1+ 次不是逗号
    • ,匹配第三个逗号
    • ([^,]+) 在第 1 组中捕获匹配 1+ 次而不是逗号

    Regex demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 2011-06-10
      相关资源
      最近更新 更多