从正则表达式中排除单词和引号
Exclude word and quotes from regexp
我有以下短语:
- “史密斯”先生
- “史密斯”先生
我只需要从这些短语中检索 Smith
。我尝试了数千种变体。我停在
(?!Mr|MrS)([^"]+)
。
请帮忙。
模式 (?!Mr|MrS)([^"]+)
从当前位置断言直接在右边的不是 Mr 或 MrS,然后捕获除 "
之外的任何字符的 1+ 次出现
所以它不会在 Mr
开始匹配,但会在 r
开始,因为在 r
之前的位置,前瞻断言为真。
您可以匹配 Mr 或 MrsS 并捕获双引号之间的内容,而不是使用环视。
\mMrS? "([^"]+)"
\m
一个单词边界
MrS?
将 Mr
与可选的 S
匹配
"
匹配一个space和"
([^"]+)
在组 1 中捕获 "
之间的内容
"
匹配 "
看到一个postgresql demo
例如
select REGEXP_MATCHES('Mr "Smith"', '\mMrS? "([^"]+)"');
select REGEXP_MATCHES('MrS "Smith"', '\mMrS? "([^"]+)"');
输出
regexp_matches
1 Smith
regexp_matches
1 Smith
我有以下短语:
- “史密斯”先生
- “史密斯”先生
我只需要从这些短语中检索 Smith
。我尝试了数千种变体。我停在
(?!Mr|MrS)([^"]+)
。
请帮忙。
模式 (?!Mr|MrS)([^"]+)
从当前位置断言直接在右边的不是 Mr 或 MrS,然后捕获除 "
所以它不会在 Mr
开始匹配,但会在 r
开始,因为在 r
之前的位置,前瞻断言为真。
您可以匹配 Mr 或 MrsS 并捕获双引号之间的内容,而不是使用环视。
\mMrS? "([^"]+)"
\m
一个单词边界MrS?
将Mr
与可选的S
匹配
"
匹配一个space和"
([^"]+)
在组 1 中捕获"
之间的内容
"
匹配"
看到一个postgresql demo
例如
select REGEXP_MATCHES('Mr "Smith"', '\mMrS? "([^"]+)"');
select REGEXP_MATCHES('MrS "Smith"', '\mMrS? "([^"]+)"');
输出
regexp_matches
1 Smith
regexp_matches
1 Smith