【问题标题】:Why does the REGEXP_LIKE function treat the letter 'e' as upper case instead of lower case?为什么 REGEXP_LIKE 函数将字母“e”视为大写而不是小写?
【发布时间】:2012-01-20 11:33:52
【问题描述】:

在我的 pl/sql 脚本中,Oracle 在通过 [:upper:] 字符类语法搜索时将字母“e”视为大写。

REGEXP_LIKE('e', '[:upper:]')

REGEXP_LIKE('e', '[:lower:]')

相关的 Oracle 文档可以在这里找到:

Oracle - Multilingual Regular Expression Syntax

Oracle - REGEXP_LIKE

【问题讨论】:

  • 如果我添加一个'\e'如下:'[:upper:]\e',我可以解决它。
  • 关于类型,我使用了 CHAR 和 VARCHAR2(1),得到了相同的结果。关于值,在这种情况下是字母“e”。
  • 经过一些测试,看起来所有其他的大写、小写和数字字符都按预期工作。

标签: sql regex oracle stored-procedures plsql


【解决方案1】:

当您用括号 [] 将字符类括起来时,它们似乎可以工作,如:

SQL> SELECT * FROM dual WHERE regexp_like('e', '[[:upper:]]');

DUMMY
-----

SQL> SELECT * FROM dual WHERE regexp_like('E', '[[:upper:]]');

DUMMY
-----
X

当您使用单括号时,Oracle 将它们视为字符列表,即以下工作,因为 u 包含在字符串 :upper: 中:

SQL> SELECT * FROM dual WHERE regexp_like('u', '[:upper:]');

DUMMY
-----
X

【讨论】:

  • +1 或者换句话说:[:upper:] 完全等同于:[epru:]
  • 太棒了,谢谢文森特。它就像一个魅力。奇怪的是,它甚至对其他字母都有效。为了澄清起见,我在 pl/sql 语句中使用它,而不是在 sql 表达式中使用它。我确认它在 pl/sql 条件语句中的工作方式相同。
  • ridgerunner,我无法在 Oracle 的文档中找到 [epru:]。有参考链接吗?
  • @Glenn Wark - 简单。 [...] 只是一个普通的字符类,它对大多数(如果不是全部)正则表达式引擎都很常见。见:regular-expressions.info
【解决方案2】:

作为文森特回答的补充说明,这是一个常见的正则表达式陷阱。参见例如Why is using a POSIX character class in my regex pattern giving unexpected results? - 您可以将 Perl 解读为 Oracle SQL,因为 正则表达式问题和解决方案与您的情况相同

这里也是用 GNU grep 说明的相同情况:

$ echo E | grep -e '[:upper:]'
grep: character class syntax is [[:space:]], not [:space:]
$ echo E | grep -e '[[:upper:]]'
E
$

所以这里没有什么特别的 Oracle。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-25
    • 2021-01-24
    • 2013-02-04
    • 2017-03-17
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多