已经尝试了一段时间,以匹配句子的最后一个单词:
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+(.*?)$');
也没有预期的意思。
任何见解?
答案 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/它是我发现的最好的在线正则表达式助手之一,它甚至会为你打破正则表达式。 (我没有以任何方式参与网站 - 这是推荐,而非插件)