通过正则表达式拆分字符串

时间:2021-06-14 19:11:50

标签: sql regex postgresql split

我有一个字符串,其中的单词有时后面有 ,;.:。这些标点符号后可以有一个或多个空格。我只需要提取现有的单词。

例如,来自:

'I use Python, SQL, C++. I need: apples and oranges'

我需要:

I, use, Python, SQL, C++, I, need, apples, and, oranges

split_part 函数可用于拆分字符。有没有办法使用这个函数(或类似的函数)来获得这种分裂。我正在考虑使用正则表达式而不是字符,但我不确定使用哪个。

2 个答案:

答案 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 在这方面很糟糕,而且总是有更多。见: