应用具有条件环视的正则表达式
Apply a Regex with a conditional lookaround
假设那些句子:
My name is James Bond
My name is the famous James Bond
我要捕获James Bond
。
如果我应用 ((?<=is)(.*)
,第一个需要 James Bond
,第二个需要 the famous James Bond
。
如果我申请((?<=famous)(.*)
,第二句需要詹姆斯·邦德。
从逻辑上讲,这样做是行不通的:
((?<=famous)|(?<=is))(.*)
是否有可能在两种情况下都以一个正则表达式返回 James Bond
结束?
随着 Regex 引擎解析器的工作,我很确定编程方式与此用例更相关,但我不太确定。
编辑------------
正则表达式应该处理任何有“is”or/and“famous”的情况,而不仅仅是这两个句子,作为示例。
这是一种表达正则表达式模式的方法:
My name is.*?([A-Z][a-z]*(?: [A-Z][a-z]*)*)
这假设在短语 My name is
之后会有一个或多个大写单词,这与之前提到的实际名称相对应。
这匹配 James Bond
的两次出现,应该适合您使用,假设您的正则表达式 tool/language 支持捕获组。
您可能会得到最后一次出现的 is
或 famous
:
.*(?:famous|is)\s*(.*)
结果在第 1 组中。请参阅 regex demo。
详情
.*
- 除换行字符外的任何 0 个或多个字符尽可能多
(?:famous|is)
- famous
或 is
子字符串(如果必须是整个单词,则使用单词边界)
\s*
- 0+ 个空格
(.*)
- 第 1 组:除换行字符外的任何 0 个或更多字符。
假设那些句子:
My name is James Bond
My name is the famous James Bond
我要捕获James Bond
。
如果我应用 ((?<=is)(.*)
,第一个需要 James Bond
,第二个需要 the famous James Bond
。
如果我申请((?<=famous)(.*)
,第二句需要詹姆斯·邦德。
从逻辑上讲,这样做是行不通的:
((?<=famous)|(?<=is))(.*)
是否有可能在两种情况下都以一个正则表达式返回 James Bond
结束?
随着 Regex 引擎解析器的工作,我很确定编程方式与此用例更相关,但我不太确定。
编辑------------ 正则表达式应该处理任何有“is”or/and“famous”的情况,而不仅仅是这两个句子,作为示例。
这是一种表达正则表达式模式的方法:
My name is.*?([A-Z][a-z]*(?: [A-Z][a-z]*)*)
这假设在短语 My name is
之后会有一个或多个大写单词,这与之前提到的实际名称相对应。
这匹配 James Bond
的两次出现,应该适合您使用,假设您的正则表达式 tool/language 支持捕获组。
您可能会得到最后一次出现的 is
或 famous
:
.*(?:famous|is)\s*(.*)
结果在第 1 组中。请参阅 regex demo。
详情
.*
- 除换行字符外的任何 0 个或多个字符尽可能多(?:famous|is)
-famous
或is
子字符串(如果必须是整个单词,则使用单词边界)\s*
- 0+ 个空格(.*)
- 第 1 组:除换行字符外的任何 0 个或更多字符。