【问题标题】:REGEX for complete word matching用于完整单词匹配的正则表达式
【发布时间】:2011-12-16 12:22:40
【问题描述】:

好吧,所以我很困惑(显然)

我正在尝试返回文本字段包含完整单词的行(来自 Oracle),而不仅仅是子字符串。

一个简单的例子是“我”这个词。

显示字符串包含单词“I”的所有行,但不只是显示“I”是某处的子字符串,如'%I%'

所以我写了我认为很简单的正则表达式:

select REGEXP_INSTR(upper(description), '\bI\b') from mytab;

期望我应该被检测到单词边界。我没有得到任何结果(或者更确切地说,每行的结果为 0。

我的期望:

  • '我是管理员' -> 1
  • '我是管理员' -> 0
  • '我是管理员吗' -> 1
  • '是臭名昭著的管理员' -> 0
  • '管理员,是我' -> 1

/b 不是应该按单词边界查找包含的字符串吗?

tia

【问题讨论】:

标签: sql regex oracle oracle10g oracle11g


【解决方案1】:

我相信您的正则表达式不支持 \b :

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm#i1007670

因此你可以这样做:

(^|\s)word(\s|$)

至少要确保您的“单词”被一些空格分隔,或者它是整个字符串。

【讨论】:

    【解决方案2】:

    Oracle 不支持单词边界锚,但即使支持,您也不会得到想要的结果:\b 匹配字母数字字符和非字母数字字符。 alnum 的确切定义因实现而异,但在大多数情况下,它是 [A-Za-z0-9_](.NET 也考虑 Unicode 字母/数字)。

    所以%I% 中的I 周围有两个边界。

    如果您将单词边界定义为“单词之前/之后的空格”,那么您可以使用

    (^|\s)I(\s|$)
    

    这也适用于字符串的开头/结尾。

    【讨论】:

    • 谢谢。这个变体给了我很好的结果:'(^|\W)TO(\W|$)' the \W is 'non-word' characters...
    • 但那会选择%I%
    • 我的意思是 %I% 作为您在 LIKE 语句中可能进行的比较的示例...抱歉有任何混淆。
    【解决方案3】:

    Oracle native regex support 是有限的。 \b< 不能用作单词分隔符。您可能需要使用 Oracle Text 进行单词搜索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 2012-01-06
      • 1970-01-01
      • 2011-08-07
      相关资源
      最近更新 更多