2009-06-03 15 views
1

私はテキストから統計の束を解析しなければならず、それらはすべて数値としてフォーマットされています。たとえば、この段落特定の文字の前に一致する正規表現ですか?

〜8等級3にニューヨーク 市の学生の81.8パーセントの合計は の88.9パーセントに比べて、 会議または超える学年レベルの数学 規格です残りの国の学生。

次の ".8"と ".9"ではなく、81と88の番号だけを一致させたいと思います。

どうすればいいですか?私はバックリファレンスという言葉やルックアヘッドなどを聞いたことがあります。それが助けになるのだろうか?

私はC#を使用しています。

編集: 上記の例では「3」と「8」が必要です。それは単純な例ですが、私はすべての数字がかなり必要です。

+0

小数点以下の数字を返すことは、大きな人口を超える統計的に有意です。私は相対的な数を見つけるために "%"というフレーズを使います。 – Craig

+0

クレイグ - あなたが意味することを理解できません - 私はこれを例として使用しました - 私の実数はパーセンテージではありません。私はちょうど "。"の後ろに来る文字を取り除く必要があります。 "e +"のような他のパターンがあります。これは単なる非常に単純な例でした。 –

答えて

2

あなたがグループに対処したくない場合は、あなたが言うように、あなたは、先読みを使用することができます。このパターンは、文字列内のすべての小数の整数部分を見つける:

Regex integers = new Regex(@"\d+(?=\.\d)"); 
MatchCollection matches = integers.Matches(str); 

matches8188が含まれています。 381を含んでいるでしょう一致し、

Regex integers = new Regex(@"(?<!\.)\d+"); 

この時間:あなたは(10進数またはない)いかなる数の整数部分と一致したい場合は、代わりに.で始まらない整数を検索することができます、8および88

+0

最初の正規表現では、最後の閉じ括弧の前に '\ d +'を置いて、文末に誤検出をしないようにしてください。 –

+0

優れた点。私は '\ d'と一緒に行きました。訂正してくれてありがとう。 – ojrac

+0

2番目のコードブロックでは、どのような構文ですか?私は何を知りませんか?<!手段。ありがとう。 –

0
/(\d+)\.\d/g 

これは(私はあなたが欲しいものだと思う)、それに続く小数を持つ任意の数と一致しますが、唯一の小数点の前に数字をキャプチャします。 \dは数字だけをキャプチャします([0-9]と同じです)。

編集:3と8も同様にしたい場合は、小数点を確認する必要はありません。

Edit2:申し訳ありませんが、小数点をすべて無視するように修正しました。下に述べたように

/(\d+)(?:\.\d+)?/g 
+0

私の編集を見てください - 私はすべての数字を取得する必要がありますが、小数点以下の数字を取り除く必要があります(私の実際のデータは狂った精度を持っています) –

+0

私はあなたの2番目のものを使用すれば、欲しい。 –

3
/[^.](\d+)[^.]/ 

はちょうどMatchObj.Groupsは、(1)の数字を取得するために使用します。

+0

小数点以下の桁も把握できませんか?その前に[^。]を入れたいかもしれません。 –

1

試してみてください。

[0-9]*(?=[3]) 

それは、小数点に続く数字のみを一致させるために先読みを使用しています。

C#コード:

Regex regex = new Regex("[0-9]+(?=[.])"); 
MatchCollection matches = regex.Matches(input); 
+1

1つ以上の数字ではなく、0桁以上の数字と一致するため、空白の入力はすべてのピリオドで行われます。 –

+0

ありがとうございました。以前は急いでいましたが、実際には注意を払っていませんでした – Stephan

0

/(\d+)((\.\d+)?)/

これを使用してみてくださいは、基本的に数字のシーケンスと数字の別の配列を有する任意小数点と一致します。次に、最初の一致値にはMatchObj.Groups(1)を使用し、2番目の一致値は無視します。

1
[^.](\d+) 

あなたの例から、これは「81」と一致します、「3」、「8」、「88」

あなたの番号を取得する前に、あなたは余分な文字を取得しますが、あなたのことができ、単にあなたのコードでそれを整理してください。

0

これはあなたが尋ねた言語ではありませんが、問題について考えるのに役立ちます。

$ echo "A total of 81.8 percent of New York City students in grades 3 to 8 are meeting or exceeding grade-level math standards, compared to 88.9 percent of students in the rest of the State." \ 
| fmt -w 1 | sed -n -e '/^[0-9]/p' | sed -e 's,[^0-9].*,,' | fmt -w 72 
81 3 8 88 

最初のfmtコマンドは、各単語を別々に検討するように要求します。 "sed -n"コマンドは、少なくとも1つの数字で始まる単語だけを出力します。 2番目のsedコマンドは、単語内の最初の非数字文字とそれ以降のすべてを削除します。 2番目のfmtコマンドはすべてを1つの行にまとめます。

$ echo "This tests notation like 6.022e+23 and 10e100 and 1e+100." \ 
| fmt -w 1 | sed -n -e '/^[0-9]/p' | sed -e 's,[^0-9].*,,' | fmt -w 72 
6 10 1 
2

完全なC#ソリューション:

/// <summary> 
/// Use of named backrefence 'roundedDigit' and word boundary '\b' for ease of 
/// understanding 
/// Adds the rounded percents to the roundedPercents list 
/// Will work for any percent value 
/// Will work for any number of percent values in the string 
/// Will also give those numbers that are not in percentage (decimal) format 
/// </summary> 
/// <returns>true if success, false otherwise</returns> 
public static bool TryGetRoundedPercents(string digitSequence, out List<string> roundedPercents) 
{ 
    roundedPercents = null; 
    string pattern = @"(?<roundedDigit>\b\d{1,3})(\.\d{1,2}){0,1}\b"; 

    if (Regex.IsMatch(digitSequence, pattern)) 
    { 
     roundedPercents = new List<string>(); 
     Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.ExplicitCapture); 

     for (Match m = r.Match(digitSequence); m.Success; m = m.NextMatch()) 
      roundedPercents.Add(m.Groups["roundedDigit"].Value); 

     return true; 
    } 
    else 
     return false; 
} 

あなたの例からは、81、3、8、88

関連する問題