সমস্ত অপসারণের জন্য রেজেক্স (অংক বা অবধি অবধি)


97

আমার কাছে "জো (00 3,004.50)" এর মতো লেখাটি ফিল্ট করে 3004.50 এ নামানো দরকার তবে রেগেক্সে ভয়াবহ এবং উপযুক্ত সমাধান খুঁজে পাচ্ছি না। সুতরাং কেবল সংখ্যা এবং পিরিয়ড থাকা উচিত - অন্য সব কিছুই ফিল্টার করা। আমি C # এবং VS.net 2008 ফ্রেমওয়ার্ক 3.5 ব্যবহার করি

উত্তর:


172

এটি করা উচিত:

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

4
কি হবে joe.smith ($3,004.50)? কেবল আপত্তিজনক চরিত্রের ক্লাসগুলি অপসারণ করা বেশ ভুল হতে পারে।
ম্যাথু গন 9

4
আমি একটি ছোট সংশোধন করি: Regex.Replace(s, "[^$0-9.]", "");আপনি ডলার সাইন ছেড়ে যেতে চান।
bodacydo

37

রেজেক্সটি হ'ল:

[^0-9.]

আপনি রেজেক্সকে ক্যাশে করতে পারেন:

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

তারপরে ব্যবহার করুন:

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

তবে আপনার মনে রাখা উচিত যে কয়েকটি সংস্কৃতিতে আর্থিক পরিমাণ লেখার জন্য আলাদা কনভেনশন রয়েছে যেমন: 3.004,50।


যাচাই করতে খুব অলস এটিএম, তবে আপনাকে এড়িয়ে যাওয়ার দরকার নেই। ?
অ্যান্ড্রু অ্যান্ডারসন

9
@ অ্যান্ড্রু: না, একটি চরিত্রের শ্রেণীর ভিতরে, .এর কোনও বিশেষ অর্থ নেই।
বার্ট কিয়ার্স

3

আপনি একটি স্ট্রিংয়ের সাথে কাজ করছেন - স্ট্রিংটি একটি IEumerable<char>, তাই আপনি লিনকিউ ব্যবহার করতে পারেন:

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

Console.WriteLine(result);   // 3004.50

2

গৃহীত উত্তরের জন্য, ম্যাথিউগন একটি বৈধ পয়েন্ট উত্থাপন করে যা পুরো স্ট্রিংয়ের সমস্ত অঙ্ক, কমা এবং সময়কাল একসাথে সংশ্লেষিত হবে। এটি এড়াতে পারবেন:

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, ",", "");
}

রেজেক্সের উপরের মনে হচ্ছে অতিরিক্ত বন্ধনী রয়েছে is ব্যবহার (?:^|[^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কোনও কিছুর হ্যান্ডেল করার জন্য , আপনি দেখতে পেলেন যে কোনও ম্যাচিং সাবস্ট্রিংয়ের সর্বাধিক একটি রয়েছে .


এই রেজেক্স সবকিছুর সাথে মেলে।
মেন্ট্রিয়ট

এটি এখন বাদে সবকিছুর সাথে মেলে ""
মেন্ট্রিয়ট

4
আপনি যে ধারণাটির প্রস্তাব দিচ্ছেন তার জন্য একটি জটিল রেজেক্স প্রয়োজন যা পড়া এবং ডিবাগ করা কঠিন is এটি বেশ কয়েকটি রেইগেক্স এবং শর্তসাপেক্ষে ধাপে বিভক্ত করা ভাল। আমি একটি উত্তর দিতে পারতাম (যদিও আমি সি না জানি রুবিতে লিখিত হয়েছে
মানসিক চাপ

@ মাইন্ড্রিয়ট পয়েন্ট নেওয়া হয়েছে। আমি এটিকে আরও স্বচ্ছ কিছুতে পরিবর্তন করেছি।
ম্যাথু গন

পার্সারে প্রেরণের মাধ্যমে, আপনার অর্থ হয় Single.Parse()নাকি Single.TryParse?
মনস্ক্রিয়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.