如何匹配PostgreSQL中句子中的最后两个单词?

时间:2016-08-03 22:23:23

标签: regex postgresql

已经尝试了一段时间,以匹配句子的最后一个单词:

select regexp_matches('My name is Harry Potter', '[^ ]+$');

返回{Potter}

尝试匹配最后两个单词:

select regexp_matches('My name is Harry Potter', '[^ ]\s+[^ ]+$');

失败。

select regexp_matches('My name is Harry Potter', '(.*?)\s+(.*?)$');

也没有预期的意思。

任何见解?

4 个答案:

答案 0 :(得分:3)

您可能最好使用REGEXP_MATCHES,而不是使用返回匹配数组的SUBSTRING,这样可以直接为TEXT提供匹配。

使用正确的模式,如@Abelisto共享,您可以这样做:

SELECT SUBSTRING('My name is Harry Potter' FROM '\w+\W+\w+$')

这会返回Harry Potter而不是{"Harry Potter"}

Per @ Hambone的评论,如果最后的任何一个单词都包含标点符号,就像撇号一样,你会考虑使用以下模式:

SELECT SUBSTRING('My name is Danny O''neal' FROM '\S+\s+\S+$')

上述内容将正确返回Danny O'neal而非O'neal

答案 1 :(得分:2)

您应该在模式中使用双重转义,因为看起来PostgreSQL实例的standard_conforming_strings参数已关闭。见PostgreSQL 9.5.3 Documentation

  

standard_conforming_strings (boolean)
  这控制普通字符串文字('...')是否按字面意思处理反斜杠,如SQL标准中所指定。从PostgreSQL 9.1开始,默认打开(先前版本默认为关闭)。

因此,您需要使用

'[^ ]+\\s+[^ ]+$'
      ^^

'\\S+\\s+\\S+$'

下面,

  • [^ ]+ - 除空格外的1个或多个字符(如果使用\\S,则为任何非空格)
  • \\s+ - 一个或多个空格
  • [^ ]+ - 除空格外的1个或多个字符(如果使用\\S,则为任何非空格)
  • $ - 字符串锚定结束。

答案 2 :(得分:0)

不知道正则表达式如何适用于postgres,但是 online regex testers告诉我.*\s(.+)\s+(.*?)$可能会做到这一点。

答案 3 :(得分:0)

我并不是100%清楚你正在尝试做什么,但这个正则表达式匹配句子的最后两个单词,它与你的初始正则表达式相似:&#34 ; [^] + \ s + [^] + $" (我刚刚添加了一个' +'。)

为了进一步测试,我建议去https://regex101.com/它是我发现的最好的在线正则表达式助手之一,它甚至会为你打破正则表达式。 (我没有以任何方式参与网站 - 这是推荐,而非插件)