すべてを削除する正規表現(非数値ORピリオド)


92

「joe($ 3,004.50)」のようなテキストを3004.50までフィルタリングする必要がありますが、正規表現ではひどく、適切な解決策を見つけることができません。したがって、数値と期間のみが残る必要があります-他はすべてフィルタリングされます。C#とVS.net 2008 Framework 3.5を使用しています

回答:


166

これはそれを行うはずです:

string s = "joe ($3,004.50)";
s = Regex.Replace(s, "[^0-9.]", "");

1
どうjoe.smith ($3,004.50)ですか?問題のある文字クラスを削除するだけでは、かなりうまくいかない場合があります。
Matthew Gunn

2
少し修正しますRegex.Replace(s, "[^$0-9.]", "");。ドル記号を残しておきます。
bodacydo

35

正規表現は次のとおりです。

[^0-9.]

あなたは正規表現をキャッシュすることができます:

Regex not_num_period = new Regex("[^0-9.]")

次に使用します:

string result = not_num_period.Replace("joe ($3,004.50)", "");

ただし、文化によっては、3.004,50のように、金額を表記するための規則が異なることに注意してください。


検証するには怠惰なATMですが、エスケープする必要はありませんか。?
Andrew Anderson

7
@Andrew:いいえ、文字クラス内で.は特別な意味はありません。
Bart Kiers、2010年

2

受け入れられた回答について、MatthewGunnは、文字列全体のすべての数字、コンマ、およびピリオドが一緒に圧縮されるという点で有効なポイントを上げます。これはそれを回避します:

string s = "joe.smith ($3,004.50)";
Regex r = new Regex(@"(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)/)");
Match m = r.match(s);
string v = null;
if (m.Success) {
  v = m.Groups[1].Value;
  v = Regex.Replace(v, ",", "");
}

上記の正規表現には余分な括弧があります。使用して(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)も文字列に「H25」に一致します「joe.smith25($ 3,004.50)」
Rivka

1

問題のある文字を削除するアプローチには、潜在的に問題があります。.文字列のどこかに別のものが存在する場合はどうなりますか?削除する必要がありますが、削除されません!

非数字またはピリオドを削除すると、文字列joe.smith ($3,004.50)は解析不能に変換され.3004.50ます。

イムホ、特定のパターンにマッチし、グループを使ってそれを抽出するほうがいいです。簡単なことは、正規表現を使用して、隣接するすべてのコンマ、数字、およびピリオドを見つけることです。

[\d,\.]+

サンプルテスト実行:

Pattern understood as:
[\d,\.]+
Enter string to check if matches pattern
>  a2.3 fjdfadfj34  34j3424  2,300 adsfa    
Group 0 match: "2.3"
Group 0 match: "34"
Group 0 match: "34"
Group 0 match: "3424"
Group 0 match: "2,300"

次に、一致ごとに、すべてのコンマを削除し、パーサーに送信します。のようなケースを処理12.323.344するには、別のチェックを実行して、一致する部分文字列に最大で1つあることを確認します.


この正規表現はすべてに一致します。
mindriot 2015

これはを除くすべてに一致します""
mindriot 2015

1
あなたが提案しているコンセプトは、読みにくくデバッグしにくい複雑な正規表現を必要とします。いくつかの正規表現と条件付きのステップに分解する方が良い場合があります。私はC#のを知っていないとRubyで書かれたが、私は(答えを提供することができます。
mindriot

@mindriotポイントを取る。より透明なものに変更しました。
Matthew Gunn、2015

パーサーに送信するとは、どちらSingle.Parse()かということSingle.TryParseですか?
mindriot

1

あなたは文字列を処理しています-文字列はIEumerable<char>なので、LINQを使用できます:

var input = "joe ($3,004.50)";
var result = String.Join("", input.Where(c => Char.IsDigit(c) || c == '.'));

Console.WriteLine(result);   // 3004.50
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.