我们如何实现正则表达式来解析和分组可能排除或不排除特定短语的字符串部分?

时间:2012-05-09 19:45:49

标签: regex

鉴于以下示例,我们如何将其解析为可能/可能不包含其他短语的组?

我们需要什么:

    (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#中使用这些正则表达式

1 个答案:

答案 0 :(得分:2)

你正朝着正确的方向前进,加上?。另外,您需要做的是替换(至少)第一个通配符匹配.*,其中包含排除您的位置指示符的内容,例如: [^@]*

编辑:我简化了你的表达(有一些额外的括号和一个不必要的非贪婪的人)并对其进行了测试。

^\s*(?<Text>[^@]*)?\s*(?:(?<LocationIndicator>[@]+)\s*(?<Location>.*))?\s*$

请参阅http://rubular.com/r/C5lfx9cvtZ