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
-1个或多个空格\\s+
-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+$'