【问题标题】:Regex substring if backward and forward slash "\/"正则表达式子字符串,如果是反斜杠和正斜杠“\/”
【发布时间】:2015-07-14 21:01:03
【问题描述】:

在反斜杠和正斜杠上分隔的正确正则表达式语法是什么?

对于 Oracle,我已经尝试过:

字符串

word1\/word2\/word3

regexp_substr(string, '[^"\\/"]+', 1, 1) first

但它不能正常工作

【问题讨论】:

  • 给定输入的期望输出是什么?
  • 期望的输出是第一个:word1

标签: regex oracle substr


【解决方案1】:

你正在使用一个字符类[^"\\/"];选择不在 set {", /, \} 中的所有字符。这可能不是你想要的。

相反,试试

`.*?(\\/|$)`

这将匹配\/ 或字符串的结尾,以先到者为准。请注意,\/ 将在匹配中包含,因为 Oracle 的 regexp_substr 似乎还不支持前瞻断言

【讨论】:

  • 谢谢,这样效果更好,但是现在每个子字符串都以 \/ 结尾,我们如何避免这种情况?
  • 例如,您可以使用字符串或正则表达式替换。
  • replace(regexp_substr(...), '\\/', '') 什么的。虽然你真的应该试着自己弄清楚……
  • 啊好的,现在我明白了。但是这样的解决方案又会牺牲性能。我仍然在考虑一种只使用正则表达式的方法......
  • 在 Oracle 正确支持负前瞻之前不可能。另外,你为什么对单个replace 争论不休? regexp_substr要贵很多
【解决方案2】:

如果您想获取所有单词,您可以将\/ 替换为space

select REPLACE ('word1\/word2\/word3','\/',' ') "changes" FROM dual 

或者如果你只想要第一个单词:

select REGEXP_SUBSTR('word1\/word2\/word3', '[^\\^/]+') "changes" FROM dual

【讨论】:

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