我有一个字符串,其中的单词有时后面有 ,
、;
、.
、:
。这些标点符号后可以有一个或多个空格。我只需要提取现有的单词。
例如,来自:
'I use Python, SQL, C++. I need: apples and oranges'
我需要:
I, use, Python, SQL, C++, I, need, apples, and, oranges
split_part
函数可用于拆分字符。有没有办法使用这个函数(或类似的函数)来获得这种分裂。我正在考虑使用正则表达式而不是字符,但我不确定使用哪个。
答案 0 :(得分:4)
是的,正则表达式可以轻松做到这一点:)
# SELECT regexp_split_to_table(
'I use Python, SQL, C++. I need: apples and oranges',
'[ .,:;]+');
┌───────────────────────┐
│ regexp_split_to_table │
├───────────────────────┤
│ I │
│ use │
│ Python │
│ SQL │
│ C++ │
│ I │
│ need │
│ apples │
│ and │
│ oranges │
└───────────────────────┘
(10 rows)
答案 1 :(得分:1)
ts_parse()
您可以将 ts_parse()
与“默认”text search parser 一起使用:
test=> SELECT token
test-> FROM ts_parse ('default', 'I use Python, SQL, C++. I need: apples and oranges')
test-> WHERE tokid <> 12;
token
---------
I
use
Python
SQL
C
I
need
apples
and
oranges
(10 rows)
不幸的是,+
符号也被修剪,被归类为“空白”或“空格符号”(tokid = 12
)。这就是 'default'
文本搜索解析器的运作方式。你可以自己写,但这不是微不足道的,必须用 C 语言和超级用户来完成。
除了 +
之外,它会很完美,并且比正则表达式处理快得多。
要查看默认解析器已知的令牌类型的完整列表:
SELECT * FROM ts_token_type('default');
要获得详细的调试视图:
SELECT *
FROM ts_debug('I use Python, SQL, C++. I need: apples and oranges foo@sdf.at 234 0699/19477759 -132 -34.547')
在坚持使用正则表达式的同时,您可以像 Wolph 建议的那样使用 regexp_split_to_table()
。我会根据您的要求推荐这种模式:
SELECT regexp_split_to_table('...', '[\s,;.:]+');
将任何仅由空格字符和您列出的标点符号组成的字符串作为分隔符。
\s
is a class shorthand for [[:space:]]
(空白字符)并且可以包含在像演示的字符类中。等效:'[[:space:],;.:]+'
。它涵盖了大多数 非打印字符。但是 UNICODE 在这方面很糟糕,而且总是有更多。见: