正则表达式获取所有前缀+单词+后缀,但没有确切的单词

Posted

技术标签:

【中文标题】正则表达式获取所有前缀+单词+后缀,但没有确切的单词【英文标题】: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'。无论如何,我找到了答案谢谢你们 【参考方案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 字符类。

以上是关于正则表达式获取所有前缀+单词+后缀,但没有确切的单词的主要内容,如果未能解决你的问题,请参考以下文章

Python:正则表达式单词匹配

如何在 PHP 中匹配具有共同前缀的单词?

仅当没有给定前缀具有任意数量的空格时才匹配单词

查找列表/文件中以特定前缀/后缀开头/结尾的所有单词

如何批量修改变量名的前缀或后缀

Ruby正则表达式过滤掉带有“字符串”后缀的单词结尾