4

このデータを「分離」して「選択」する際に問題が発生しています。ヘルパー関数などオプションですが、正規表現のみを使用して(そしてマッチング後にマッチグループを処理して)これを解決したいと思います。

これは私が持っているデータ(の一部)です:

Belgium
Belgium M_Foo
Belgium A_Bar
Belgium M_FooBar
Belgium S_Whooptee Doo
Belgium Xxx
Belgium S_Foo Bar
United Kingdom
United Kingdom W_Foo-Bar
United Kingdom M_Yay
United Kingdom Xxx
United Kingdom S_Derp
United Kingdom F_Doh Lorem
United Kingdom S_Ipsum Dolor
United States of America L_Foo
Macedonia F.Y.R. Xxx
Macedonia F.Y.R. S_Foo Bar
Cyprus (Greek) M_Foo
Congo (Democratic Republic of)
Congo (Democratic Republic of) Q_Yolo

基本的に、これは文字列の配列の「キー/値」の並べ替えです。国名が含まれており(正規化されていないため、ハードコードされた国名や「ルックアップ」を使用できません。国名以外の文字列である可能性があります)、optionallyその後にキーワードXxx または <random_upcase_char>_<random_text>.

私は次の正規表現を思いつきました:

^(.+?)(?:\s+(Xxx|[A-Z]_.*)?)

または、最初の一致グループの小さな違い:

^(.*?)(?:\s+(Xxx|[A-Z]_.*)?)

これは、 で始まる最初の文字列に対してはうまく機能しBelgiumます。これらのレコードについて、次の結果が返されます。

Group 1     Group 2
================================
Belgium
Belgium     M_Foo
Belgium     A_Bar
Belgium     M_FooBar
Belgium     S_Whooptee Doo
Belgium     Xxx
Belgium     S_Foo Bar

ただし、次の行は問題を引き起こします。

Group 1     Group 2
================================
United
United
United
United
United
United
United
United
Macedonia
Macedonia
Cyprus
Congo
Congo

正規表現でやりたいことは次のとおりです。

Group 1                         Group 2
================================================
United Kingdom
United Kingdom                  W_Foo-Bar
United Kingdom                  M_Yay
United Kingdom                  Xxx
United Kingdom                  S_Derp
United Kingdom                  F_Doh Lorem
United Kingdom                  S_Ipsum Dolor
United States of America        L_Foo
Macedonia F.Y.R.                Xxx
Macedonia F.Y.R.                S_Foo Bar
Cyprus (Greek)                  M_Foo
Congo (Democratic Republic of)
Congo (Democratic Republic of)  Q_Yolo

しかし、最初の部分が一致しません。最初のマッチグループの貪欲/貪欲でないオプションと関係があると確信していますが、しばらくいじった後、それを機能させることができません...

余分な/その他の/より多くのマッチグループが返されるかどうかは気にしません。正規表現は、.Net C#アプリケーションで使用することを目的としています (これがどの「方言」であるか疑問に思っている場合)。

どんな助けでも大歓迎です。

4

4 に答える 4

0

私はこの正規表現であなたが望むものを管理しました(複数行で実行):

^((?:.+?| )+?)(?:\s+(Xxx|[A-Z]_.*)|\s)?$

あなたの入力を使用すると、私にこの結果が得られました:

1: Belgium                  2: 
1: Belgium                  2: M_Foo
1: Belgium                  2: A_Bar
1: Belgium                  2: M_FooBar
1: Belgium                  2: S_Whooptee Doo
1: Belgium                  2: Xxx
1: Belgium                  2: S_Foo Bar
1: United Kingdom           2: 
1: United Kingdom           2: W_Foo-Bar
1: United Kingdom           2: M_Yay
1: United Kingdom           2: Xxx
1: United Kingdom           2: S_Derp
1: United Kingdom           2: F_Doh Lorem
1: United Kingdom           2: S_Ipsum Dolor
1: United States of America 2: L_Foo
1: Macedonia F.Y.R.         2: Xxx
1: Macedonia F.Y.R.         2: S_Foo Bar
1: Cyprus (Greek)           2: M_Foo
于 2013-01-17T10:44:39.437 に答える
0

これを試してください(大文字と小文字は区別されません):

^([A-Z]+(?:\s+(?!Xxx)[A-Z]+)*(?:\s+\([^)]+\))?)(?:\s+(Xxx|(?:[-A-Z_.]+(?:\s+[-A-Z_.]+)*)))?$

それはあなたのすべての例で機能します。ただし、率直に言って、データを適切に区切る必要があります。

デモ:

$ perl -ne '/^([A-Z]+(?:\s+(?!Xxx)[A-Z]+)*(?:\s+\([^)]+\))?)(?:\s+(Xxx|(?:[-A-Z_.]+(?:\s+[-A-Z_.]+)*)))?$/i and print "MATCH: group 1 is \"$1\", group 2 is \"$2\"\n"'
> Belgium
> Belgium M_Foo
> Belgium A_Bar
> Belgium M_FooBar
> Belgium S_Whooptee Doo
> Belgium Xxx
> Belgium S_Foo Bar
> United Kingdom
> United Kingdom W_Foo-Bar
> United Kingdom M_Yay
> United Kingdom Xxx
> United Kingdom S_Derp
> United Kingdom F_Doh Lorem
> United Kingdom S_Ipsum Dolor
> United States of America L_Foo
> Macedonia F.Y.R. Xxx
> Macedonia F.Y.R. S_Foo Bar
> Cyprus (Greek) M_Foo
> Congo (Democratic Republic of)
> Congo (Democratic Republic of) Q_Yolo
> EOF
MATCH: group 1 is "Belgium", group 2 is ""
MATCH: group 1 is "Belgium", group 2 is "M_Foo"
MATCH: group 1 is "Belgium", group 2 is "A_Bar"
MATCH: group 1 is "Belgium", group 2 is "M_FooBar"
MATCH: group 1 is "Belgium", group 2 is "S_Whooptee Doo"
MATCH: group 1 is "Belgium", group 2 is "Xxx"
MATCH: group 1 is "Belgium", group 2 is "S_Foo Bar"
MATCH: group 1 is "United Kingdom", group 2 is ""
MATCH: group 1 is "United Kingdom", group 2 is "W_Foo-Bar"
MATCH: group 1 is "United Kingdom", group 2 is "M_Yay"
MATCH: group 1 is "United Kingdom", group 2 is "Xxx"
MATCH: group 1 is "United Kingdom", group 2 is "S_Derp"
MATCH: group 1 is "United Kingdom", group 2 is "F_Doh Lorem"
MATCH: group 1 is "United Kingdom", group 2 is "S_Ipsum Dolor"
MATCH: group 1 is "United States of America", group 2 is "L_Foo"
MATCH: group 1 is "Macedonia", group 2 is "F.Y.R. Xxx"
MATCH: group 1 is "Macedonia", group 2 is "F.Y.R. S_Foo Bar"
MATCH: group 1 is "Cyprus (Greek)", group 2 is "M_Foo"
MATCH: group 1 is "Congo (Democratic Republic of)", group 2 is ""
MATCH: group 1 is "Congo (Democratic Republic of)", group 2 is "Q_Yolo"
于 2013-01-17T10:45:29.743 に答える
0

/(?:^(.+)\s+(Xxx|[A-Z]_.+)$|^(.+)$)/gmはすべての文字列に一致します、国のみを含む行は 3 番目の一致に配置されます (結果を確認する際に確認してください)。

デモ

于 2013-01-17T10:46:20.483 に答える
0

場合によっては、貪欲でない一致では、固定が非常に重要になります。この場合、行末に固定すると問題が解決します。正規表現は次のようになります。

^(.+?)(?:\s+(Xxx|[A-Z]_.*))?$

?オプションの ( ) 量指定子も、もう 1 つグループ化レベルの外に移動したことに注意してください。したがって、スペースはオプションです。

于 2013-01-17T10:39:52.250 に答える