【问题标题】:regexp get all prefix+word+postfix but without the exact word正则表达式获取所有前缀+单词+后缀,但没有确切的单词
【发布时间】:2018-04-19 04:07:24
【问题描述】:

以下示例

表一

id    desc  
0    qqqqqwertyyyy  
1    qwerty  
2    bbbbqwerty     
3    a qwerty

想要的输出

0 qqqqqwertyyyy  
1 111qwerty

【问题讨论】:

  • 没有问题,输出与输入数据不匹配。
  • 我不明白这个问题。 “确切的词”在哪里以及在哪里匹配?
  • 确切的词是'qwerty'和'a qwerty'。无论如何,我找到了答案谢谢你们

标签: regex oracle plsql


【解决方案1】:

您可以将正则表达式分解为:

\S+qwerty\b|\bqwerty\S+|\S+qwerty\S+

这将匹配 qwerty 仅当嵌入在其他词中。

【讨论】:

  • @jojo,plsql 正则表达式引擎是否不支持单词边界 \b 和非空格字符 \S?。请尝试:[0-9a-zA-Z]+qwerty[[:>:]]|[[:<:]]qwerty[0-9a-zA-Z]+|[0-9a-zA-Z]+qwerty[0-9a-zA-Z]+
  • 正则表达式中的字符类无效
  • 从您提供的链接来看,\A 似乎是词边界的正确选择。所以试试正则表达式:[0-9a-zA-Z]+qwerty\A|\Aqwerty[0-9a-zA-Z]+|[0-9a-zA-Z]+qwerty[0-9a-zA-Z]+
  • 答案或 cmets 中的正则表达式在 Oracle 中均无效 - \b 在 Oracle 中无效,[:>:] 将匹配 :>[[:>:]] is not a valid POSIX字符类。 \A matches only at the beginning of a string, or before a newline character at the end of a string 所以这些都不起作用。
  • @MT0 那么像 javascript 中的 \bword\b 这样的正则表达式在 Oracle 中应该写成 \Aword\Z 吗?如果是这种情况,正则表达式 [0-9a-zA-Z]+qwerty\Z|\Aqwerty[0-9a-zA-Z]+|[0-9a-zA-Z]+qwerty[0-9a-zA-Z]+ 应该可以工作。
【解决方案2】:

要匹配前缀和后缀,试试这个:

SELECT * FROM tablename WHERE    
    REGEXP_LIKE (fieldname, '[^[:space:]]+qwerty')
    OR  REGEXP_LIKE (fieldname, 'qwerty[^[:space:]]+');

【讨论】:

  • 我不想在这里匹配确切的单词 qwerty
  • 你试过了吗? qwerty 不会在这里匹配。 'qwerty_%'prefix 匹配,因为 qwerty 之后至少需要 1 个或多个字符,因为 _%'%_qwerty' 是一个后缀匹配,因为 qwerty 之前至少需要 1 个或多个字符,因为 %_
  • 是的,但它匹配“a qwerty”。我需要的是即使有空格也不匹配确切的单词 qwerty
  • @jojo 好的,我明白了。我编辑了我的答案,请随意尝试。
  • 这是错误的 - [^\s] 将匹配不是 \ 字符或 s 字符的所有字符。您可以改用[^[:space:]]POSIX 字符类。
猜你喜欢
  • 2017-09-23
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2012-02-21
相关资源
最近更新 更多