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 に答える