0

我在 Oracle 中有一个表,其中一列包含形式为 \ 的 UserId。例如“fin\george”、“sales\andy”等。如何使用 REGEXP_SUBSTR 函数仅从 UserIds 中获取。即我只想获取“george”、“andy”等。我已经使用 SUBSTR 函数实现了所需的结果,但在这种情况下我想使用 REGEXP_SUBSTR。

我试过这样做:

SELECT REGEXP_SUBSTR('fin\george','\[^\]+,') "UserName" FROM DUAL;

但它没有帮助。谁能指出我的错误?

4

5 回答 5

4

我相信您想使用regexp_replace带有反向引用的 a 。我假设之前和之后的所有字符\都是字母。如果你允许数字,你会想要使用[[:alnum:]]而不是[[:alpha::]

  1* SELECT REGEXP_replace('fin\george',
                           '([[:alpha:]]+\\)([[:alpha:]]+)$', 
                           '\2') "UserName" 
       FROM DUAL
SQL> /

UserNa
------
george
于 2012-06-20T14:33:22.140 回答
1
select regexp_replace( 'fin\george', '.*\\', null ) from dual;

返回george

\正则表达式将尽可能多地匹配后面的任何字符(被转义)(贪婪)。所以它将匹配所有东西到决赛\。然后匹配的字符串被替换为null.

null是默认的所以

select regexp_replace('fin\george', '.*\\' ) from dual;

做同样的事情

相同的表达式可以从路径名的末尾提取文件名,例如

select regexp_replace ('fin\fin2\fin3\fin4\george', '.*\\' ) from dual;

也会回来george

于 2012-08-17T11:41:32.803 回答
1
SQL> SELECT REGEXP_SUBSTR('fin\george', '[^\]+', 1, 2) AS userId from dual;

USERID
------
george

请参阅此 Oracle Base 文章

于 2013-09-22T16:11:58.430 回答
0

您必须使用转义: \\ 而不是 \

于 2012-06-20T14:26:32.063 回答
0

执行此操作的最简单方法(恕我直言)如下:

SELECT REGEXP_SUBSTR('fin\george', '[^\\]+$') AS "UserName" FROM DUAL;

您的原始查询的问题是 (a)\字符没有被转义和 (b) 正则表达式中有一个多余的逗号。我在$这里使用了字符串结尾锚,假设由 . 分隔的元素不超过两个\。如果有两个以上,而您只需要第二个,则可以使用以下内容:

SELECT REGEXP_SUBSTR('fin\george\ringo', '[^\\]+', 1, 2) AS "UserName"
  FROM DUAL;

这告诉 Oracle 开始查看字符串的第一个字符并返回第二个匹配项。

于 2017-08-17T13:33:33.267 回答