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

Regex 如何在PostgreSQL中匹配句子中的最后两个单词?,regex,postgresql,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+(.*?)$');

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

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+(.*?)$');
也没有按原意说


有什么见解吗?

我不知道正则表达式如何适用于postgres,但是
告诉我,
*\s(+)\s++(.*)$
可能会起作用。

我不是100%清楚你想做什么,但是这个正则表达式匹配一个句子的最后两个单词,它类似于你的初始正则表达式:“[^]+\s+[^]+$”(我刚刚添加了一个“+”)


对于进一步的测试,我建议去它是我找到的最好的在线正则表达式助手之一,它甚至可以为你分解正则表达式。(我不以任何方式参与该网站-这是一个推荐,不是一个插件)

与其使用返回匹配数组的
REGEXP\u MATCHES
,不如使用
子字符串
,它将直接以
文本
的形式为您提供匹配

使用正确的模式,如@Abelisto shared,可以执行以下操作:

SELECT SUBSTRING('My name is Harry Potter' FROM '\w+\W+\w+$')
这将返回
harrypotter
,而不是
{“harrypotter”}

< P> @ Hambone的评论,如果结尾的任何一个词都包含标点符号,如撇号,你会想考虑使用下面的模式:

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

上述操作将正确返回
Danny O'neal
,而不是仅返回
O'neal
,您应该在模式中使用双转义,因为您的PostgreSQL实例的
标准一致性字符串
参数似乎已关闭。见:

标准一致性字符串(布尔值)

这控制普通字符串文本(
“…”
)是否按照SQL标准中的规定按字面方式处理反斜杠。从PostgreSQL 9.1开始,默认设置为on(早期版本默认设置为off)

因此,您需要使用

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

这里,

  • [^]+
    -1个或多个字符,而不是空格(如果使用了
    \\S
    ,则为任何非空白字符)
  • \\s+
    -1个或多个空格
  • [^]+
    -1个或多个字符,而不是空格(如果使用了
    \\S
    ,则为任何非空白字符)
  • $
    -字符串结束锚定

“[^]+\\s+[^]+$”
?或者
select regexp\u matches('My name is Harry Potter','(\\S+\\S+)(\\S+$)
试试
'\w+\w+\w+$'
@Wiktor Stribiżew,谢谢!您的解决方案“[^]+\\s+[^]+$”有效!然后我会发布解决方案是的,再次感谢。回答得很好。如果你还想捕捉特殊的字符(比如“不要”出现时,您可能希望在正则表达式中使用空格和非空格:
'\S+\S+$'
@Hambone-很好的建议,我将更新帖子以包括这一点。如果您关闭了符合标准的字符串,则只需使用双反斜杠,这不是v9.1的默认开始:@Nicarus:这是一个非常有用的链接,感谢您指出您的问题T
'\\S+\\s+\\S+$'