【问题标题】:Oracle regex - does not start with and does not end withOracle 正则表达式 - 不以开头也不以结尾
【发布时间】:2013-06-10 08:11:06
【问题描述】:

以下Oracle正则表达式不起作用,我不知道为什么。

“不以'abc'开头”:

^[^(abc)]

“不以'abc'结尾”:

[^(abc)]$

问题在于,Oracle 正则表达式引擎似乎无法将“abc”字符串识别为一个单元,而只是单独查看字母。括号 () 应该创建一个字符串单元。所以我不知道发生了什么。我使用方括号只是因为我相信'not'运算符 ^ 只在方括号内操作,否则 ^ 被识别为行首。

供参考: http://docs.oracle.com/cd/B12037_01/appdev.101/b10795/adfns_re.htm

【问题讨论】:

  • 试试:([^A].*|.[^B].*|..[^C].*)
  • @parzival aabbcc 不适用于您的正则表达式,我认为它应该适用于 OP。

标签: regex oracle


【解决方案1】:

像这样测试不匹配会变得很复杂,所以我建议测试匹配并否定结果。

不以abc开头:

WHERE NOT REGEXP_LIKE(myString, '^abc')

不以abc结尾:

WHERE NOT REGEXP_LIKE(myString, 'abc$')

至于为什么它不起作用,正如@DavidKnipe 在他的回答中所说:这是因为您正在使用字符类。正则表达式^[^(abc)] 解析如下:

  • 第一个^ 表示“锚定到字符串的开头”
  • [^(abc)] 是一个字符类,它表示“匹配任何单个字符,只要它不是(abc)” .

【讨论】:

    【解决方案2】:

    用于否定的^ 运算符仅适用于字符类。但是你不应该使用字符类。我不知道 Oracle 正则表达式是否允许环视操作(前瞻和后瞻)。如果有,请使用^(?!abc)(?<!abc)$

    【讨论】:

    • 不幸的是,他们没有……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    相关资源
    最近更新 更多