1

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

我们需要的:

    (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>=""

这个正则表达式可以满足我们的需要,但前提是我们包含 @ 短语:

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

如果我们排除 @ 短语,我们将找不到匹配项。换句话说,这无法匹配/分组:

    "meet me":
            <Text>="meet me"
            <LocationIndicator>=""
            <Location>=""

我们试过包括一个?在 LocationIndicator/Location 组之后,但将短语与文本分组:

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

    "meet me @home":
            <Text>="meet me @home"
            <LocationIndicator>=""
            <Location>=""

我们如何用一个表达式匹配所有给出的示例?

注意:我们在 C# 中使用这些正则表达式

4

1 回答 1

2

您正朝着正确的方向前进,添加?. 此外,您需要做的是将(至少)第一个通配符匹配替换为.*不包括您的位置指示符的内容,例如[^@]*

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

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

http://rubular.com/r/C5lfx9cvtZ

于 2012-05-09T20:14:50.303 回答