鉴于以下示例,我们如何将其解析为可能/可能不包含其他短语的组?
我们需要什么:
(Text: any number of words) (LocationIndicator: 0 or 1 @) (Location: any number of words)
示例:
"meet me @home":
<Text>="meet me"
<LocationIndicator>="@"
<Location>="home"
"meet me in the kitchen @home":
<Text>="meet me in the kitchen"
<LocationIndicator>="@"
<Location>="home"
" meet me @ home ":
<Text>="meet me"
<LocationIndicator>="@"
<Location>="home"
"meet me":
<Text>="meet me"
<LocationIndicator>=""
<Location>=""
这个正则表达式做了我们需要的,但只有当我们包含@ phrase:
时 ^\s*(((?<Text>.*)?)\s*((?<LocationIndicator>(?:@)+?)\s*(?<Location>.*)))\s*$
如果我们排除@短语,我们就没有匹配。换句话说,这无法匹配/分组:
"meet me":
<Text>="meet me"
<LocationIndicator>=""
<Location>=""
我们尝试过包括?在LocationIndicator / Location组之后,但是将短语分组为Text:
^\s*(((?<Text>.*)?)\s*((?<LocationIndicator>(?:@)+?)\s*(?<Location>.*))?)\s*$
"meet me @home":
<Text>="meet me @home"
<LocationIndicator>=""
<Location>=""
我们如何匹配单个表达式给出的所有示例?
注意:我们在C#中使用这些正则表达式
答案 0 :(得分:2)
你正朝着正确的方向前进,加上?
。另外,您需要做的是替换(至少)第一个通配符匹配.*
,其中包含排除您的位置指示符的内容,例如: [^@]*
。
编辑:我简化了你的表达(有一些额外的括号和一个不必要的非贪婪的人)并对其进行了测试。
^\s*(?<Text>[^@]*)?\s*(?:(?<LocationIndicator>[@]+)\s*(?<Location>.*))?\s*$