0

私は正規表現の初心者です。
1)372万人(国ランク:6位)(2004年推定)
2)10000人(2007年推定)のようなフォーマットの文字列があります

この2種類の文字列から人口数と時間を抽出したいと思います。C#の正規表現でそれを行うにはどうすればよいですか?または、複数の正規表現を作成する必要がありますか?

4

4 に答える 4

3

出発点は次のとおりです。

(?<population>\d\(.\d+)?)  #capturing group named "population"
                           #that is a number, optionally followed by a
                           #decimal point and at least one number
\s*                        #followed by one or more spaces
(?<magnitude>thousand|(m|b)illion)? #optional capturing group named "magnitude"
                                    # that matches "thousand", "million", or "billion"
\s*                        #one or more whitespace characters
people                     #the literal "people"
.*                         #match any number of characters
\(                         #Find literal opening parentheses...
   (?<year>\d{4})          #...followed by a four-digit year...
\s                         #...followed by a space...
estimate\)                 #...followed by the phrase "estimate)"
\s*$                       #followed by optional whitespace
                           #and the end of the string

使用法を示す簡単なドライバー:

class Program
{
/// Generate test strings
static IEnumerable<string> Generator()
{
    yield return "3.72 million people (country rank: 6th) (2004 estimate)";
    yield return "10000 people (2007 estimate)";
}

public static void Main()
{
    string expression = @"
(?<population>\d(.\d+)?)  #capturing group named 'population'
                           #that is a number, optionally followed by a
                           #decimal point and at least one number
\s*                        #followed by one or more spaces
(?<magnitude>thousand|(m|b)illion)? #optional capturing group named 'magnitude'
                                    # that matches 'thousand', 'million', or 'billion'
\s*                        #one or more whitespace characters
people                     #the literal 'people'
.*                         #match any number of characters
\(                         #Find literal opening parentheses...
   (?<year>\d{4})          #...followed by a four-digit year...
\s                         #...followed by a space...
estimate\)                 #...followed by the phrase 'estimate'
\s*$                       #followed by optional whitespace
                           #and the end of the string";

    RegexOptions options = 
        RegexOptions.IgnorePatternWhitespace // allow whitespace/comments
        | RegexOptions.IgnoreCase
        | RegexOptions.ExplicitCapture; // Only capture named groups

    Regex r = new Regex(expression, options);
    foreach (var test in Generator())
    {
        Match match = r.Match(test);
        if (!match.Success)
            Console.WriteLine("Could not match {0}", test);
        else
        {
            double population = double.Parse(match.Groups["population"].Value);
            if (match.Groups["magnitude"].Success) // magnitude is optional
                                                   // but if present, need to
                                                   // multiply population
            {
                switch (match.Groups["magnitude"].Value.ToLower())
                {
                    case "thousand": population *= 1000; break;
                    case "million": population *= 1E6; break;
                    case "billion": population *= 1E9; break;
                    default: throw new FormatException("Unexpected value in magnitude group");
                }
            }
            int year = int.Parse(match.Groups["year"].Value);
            Console.WriteLine("In {0}, population was {1} people.", year, population);
        }
    }
}

出力:

In 2004, population was 3720000 people.
In 2007, population was 10000 people.
于 2012-07-14T05:25:20.027 に答える
2

試す:

(?<number>\d+.\d*)(?: million)? people(?: \(country rank: 6th\))? \((?<year>\d+) estimate\)

http://regexhero.net/tester/では、次の結果が得られます ここに画像の説明を入力してください

http://myregextester.com/index.phpで、次のようになります。 ここに画像の説明を入力してください

于 2012-07-14T05:52:54.230 に答える
1

ターゲットがこのパターンの場合は、次のパターンを試してくださいRegex

[population/number and text] people [some text] ([date] estimate)

正規表現:

var match = Regex.Match(inputString, 
                        @"(?<number>[\.\d]+(\s+\w+)?)\s+people .+\((?<date>\d+)\s+estimate\)");

var population = match.Groups["number"].Value;
var date = match.Groups["date"].Value;
于 2012-07-14T05:20:06.383 に答える
1

異なる方法で処理したいので、おそらく2つの正規表現が必要になります。「1)」と「2)」を含む2行全体をコピーして貼り付けました。これが人口のためです(最初にスペースがあります):

 \d+(?!\w)\.?(?=\d*)\d*

スペースの後に文字がない場合は1つ以上の数字が続き、その後に1つまたはゼロのドットが続きます。次の文字が1つ以上の数字の後に数字が続く場合にのみ有効です。百万/千のような単語については、ゼロに置き換える必要があります。

次に、日付の部分:

(?:\()\d{4}(?!\d)

冒頭の括弧を覚えずに一致させ、5番目のものが数字でない場合は4桁を続けます。

お役に立てば幸いです。正直なところ、私はc#をあまり知らないので、JavaScriptでテストしました。

編集:他の人はより完全な答えを持っていて、実際にはc#にいます。チェックしてください。

于 2012-07-14T05:24:14.897 に答える