5

我需要选择字符串中的前 X 个单词,其中 x 可以是 0-100 之间的任何数字。是否有捷径可寻?我发现以下示例从字符串中选择前 2 个单词:

select regexp_replace('Hello world this is a test', '(\w+ \w+).*$','\1') as first_two
from dual

如何从字符串中选择前 X 个单词,其中 X 可以是 0-100 之间的数字?

4

3 回答 3

4

选择前四个单词:

select
   regexp_replace(
     'Hello world this is a test etc',
     '(((\w+)\s){4}).*',  -- Change 4 to wanted number of words here!
     '\1'
   )
   from dual;

编辑

上述解决方案仅在单词仅由一个空格字符分隔时才有效。如果单词由一个或多个空格字符分隔,则\s必须扩展为\s+

select
   regexp_replace(
     'Hello    world   this   is a   test     etc',
     '(((\w+)\s+){4}).*',  -- Change 4 to wanted number of words here!
     '\1'
   )
   from dual;
于 2015-06-03T13:11:38.470 回答
1

此方法将提取您想要的单词数的结果,然后将多个空格减少为一个:

select trim(regexp_replace(regexp_substr('Hello         world this is a test etc', '(([^ ]*)( |$)*){3}'), ' +', ' '))
from dual;

编辑:这越来越难看,但在它周围包裹了一个 TRIM() 以摆脱尾随空格(选择的最后一个单词之后的那个)。

于 2015-06-03T14:59:28.653 回答
0

这样可以,但可能有点不雅,将“2”替换为要查找的单词数

select substr('this is a number of words',1,instr('this is a number of words',' ',1,2))
from dual

确实假设单词总是以空格结尾

于 2015-06-03T13:01:09.593 回答