বর্ণানুক্রমিক পাঠ্য থেকে নেতৃস্থানীয় শূন্যগুলি কীভাবে সরিয়ে ফেলবেন?


228

আমি এখানে এসও-তে শূন্যপদ উপস্থাপন করার প্রশ্নগুলি দেখেছি। তবে অন্যভাবে নয়!

আপনি কি আমাকে পরামর্শ দিতে পারেন কীভাবে আলফানিউমেরিক পাঠ্যে অগ্রণী জিরোগুলি সরিয়ে ফেলা যায়? এখানে কি কোনও অন্তর্নির্মিত এপিআই রয়েছে বা নেতৃস্থানীয় শূন্যগুলি ছাঁটাতে আমাকে কোনও পদ্ধতি লিখতে হবে?

উদাহরণ:

01234 converts to 1234
0001234a converts to 1234a
001234-a converts to 1234-a
101234 remains as 101234
2509398 remains as 2509398
123z remains as 123z
000002829839 converts to 2829839

উত্তর:


617

কাজের জন্য রেজেক্স হ'ল সেরা হাতিয়ার; এটি কী হওয়া উচিত তা সমস্যার নির্দিষ্টকরণের উপর নির্ভর করে। নিম্নলিখিতগুলি নেতৃস্থানীয় শূন্যগুলি সরিয়ে দেয়, তবে প্রয়োজনে একটি ছেড়ে দেয় (উদাহরণস্বরূপ এটি কেবল "0"একটি ফাঁকা স্ট্রিংয়ের দিকে ঘুরিবে না)।

s.replaceFirst("^0+(?!$)", "")

^নোঙ্গর নিশ্চিত করুন যে করতে হবে 0+মিলেছে হচ্ছে ইনপুট শুরুতে হয়। (?!$)নেতিবাচক lookahead নিশ্চিত করে যে না সমগ্র স্ট্রিং সাথে মিলে যাবে।

পরীক্ষার জোতা:

String[] in = {
    "01234",         // "[1234]"
    "0001234a",      // "[1234a]"
    "101234",        // "[101234]"
    "000002829839",  // "[2829839]"
    "0",             // "[0]"
    "0000000",       // "[0]"
    "0000009",       // "[9]"
    "000000z",       // "[z]"
    "000000.z",      // "[.z]"
};
for (String s : in) {
    System.out.println("[" + s.replaceFirst("^0+(?!$)", "") + "]");
}

আরো দেখুন


21
ধন্যবাদ. এবং আপনি নির্মমভাবে পরীক্ষা করেছেন;) দুর্দান্ত !! পরীক্ষার জন্য +1।
জয়

4
@ গ্রেগ: এই প্রশ্নটি জাভা সম্পর্কিত, জাভাস্ক্রিপ্টের নয়। জাভা এসই এর স্ট্রিং.রেপ্লেস ফার্স্ট () সংস্করণ 1.4 থেকে রয়েছে।
জোনিক

5
s.replaceFrst ("^ 0 + (?! $)", "") (যেমন। s.trim ()। প্যাডেড স্পেসগুলি সরানোর ক্ষেত্রে!
এভিএ

2
এত সহজ কাজটির জন্য রেজেক্স কিছুটা ব্যয়বহুল নয়?
ডেমোঙ্গোলেম

5
এটি কোটলিনে কাজ করে না, আপনাকে রেজেক্স সম্পর্কে স্পষ্ট হওয়া দরকার .replaceFirst("^0+(?!$)".toRegex(), "")
কোটলিনে

100

আপনি ব্যবহার করতে পারেন এপাচি কমন্স ল্যাং থেকে স্ট্রিংগিলস ক্লাসটি :

StringUtils.stripStart(yourString,"0");

এই একা "0" নিয়ে সমস্যা আছে? @ হ্যামিলটন রডরিগস
ফুনওনে

2
এটি যদি "0" এ একা ব্যবহার করা হয় তবে এটি "" ফিরিয়ে দেয়। সুতরাং এটি প্রয়োজনীয় কাঙ্ক্ষিত প্রভাব না হলে যত্ন নিন।
darkpRINCE

আপভোটেড কারণ এটি জিজ্ঞাসিত প্রশ্নে ব্যবহারের ক্ষেত্রে কাজ করে। দ্রুত সমাধানের জন্য আমাকে এখানেও সহায়তা করেছেন। ধন্যবাদ!
গ্যাব্রিয়েল অ্যামাজনাস মেসকিটা

32

কীভাবে রেজেক্স উপায় সম্পর্কে:

String s = "001234-a";
s = s.replaceFirst ("^0*", "");

^স্ট্রিং এর শুরু নোঙ্গর (আমি প্রসঙ্গ থেকে অভিমানী করছি আপনার স্ট্রিং বহু-লাইন এখানে নেই, অন্যথায় আপনি মধ্যে চেহারা করার প্রয়োজন হতে পারে \Aলাইনের শুরু বদলে ইনপুট শুরুর জন্য)। 0*মানে শূন্য বা তার বেশি 0অক্ষর (আপনি পারে ব্যবহার 0+পাশাপাশি)। শুরুতে এই replaceFirstসমস্ত 0অক্ষরটিকে কেবল কিছুই দিয়ে প্রতিস্থাপন করে ।

এবং, যদি ভাদজিমের মতো, আপনার নেতৃস্থানীয় শূন্যগুলির সংজ্ঞায় খালি স্ট্রিং (যুক্তিসঙ্গত পর্যাপ্ত প্রত্যাশা) রূপান্তর "0"( "000"বা অনুরূপ স্ট্রিংগুলি) অন্তর্ভুক্ত না হয় , প্রয়োজনে কেবল এটিকে ফিরিয়ে দিন:

String s = "00000000";
s = s.replaceFirst ("^0*", "");
if (s.isEmpty()) s = "0";

6
এটি একা "0" নিয়ে সমস্যা রয়েছে।
ভাদজিম

23

কোনও রেজিএক্সপ এবং কোনও বাহ্যিক লাইব্রেরির প্রয়োজন ছাড়াই একটি পরিষ্কার উপায় way

public static String trimLeadingZeros(String source) {
    for (int i = 0; i < source.length(); ++i) {
        char c = source.charAt(i);
        if (c != '0') {
            return source.substring(i);
        }
    }
    return ""; // or return "0";
}

1
যদিও আপনার জায়গার জন্য চেক প্রশ্ন অনুসারে নয়, তবুও আমি মনে করি আপনার উত্তরটি দ্রুত কার্যকর করবে।
জন ফোলার

@ জনফোলার ক্যাচের জন্য 10x, 2+ বছর পরে স্থির
ম্যাজিক ক্র্যাফটার

1
যদি লুপটি কেবল শূন্যগুলি খুঁজে পায় তবে পদ্ধতিটির শেষে একটি রিটার্ন দরকার। ফিরে ""; বা "0" প্রত্যাবর্তন করুন; আপনি যদি কমপক্ষে একটি শূন্য চান
পিছলে

@ স্লিপ্পিয়ারিজিয়াল আমি এটি উন্মুক্ত রেখেছি যাতে আপনি আপনার প্রয়োজনের ভিত্তিতে এটি পরিবর্তন করতে পারেন তবে যেহেতু লোকেরা অনুলিপি / পেস্ট করার ঝোঁক রাখে, তাই সর্বদা একটি ডিফল্ট আচরণ করা খারাপ ধারণা নয়। মন্তব্যের জন্য ধন্যবাদ
ম্যাজিক্রাফটার

14

তালিকার অ্যাপাচি কমন্সের উত্তরটি নিয়ে যেতে: পেয়ারা-লাইব্রেরি ব্যবহার করে (গুগলের সাধারণ উদ্দেশ্যযুক্ত জাভা ইউটিলিটি লাইব্রেরি যা আমি মনে করি যে এখন কোনও তুচ্ছ জাভা প্রকল্পের ক্লাসপাথে থাকা উচিত ), এটি চারম্যাচার ব্যবহার করবে :

CharMatcher.is('0').trimLeadingFrom(inputString);

+1, পেয়ারা ব্যবহার করে যে কোনও প্রকল্পের সঠিক উত্তর। (এবং এখন ২০১২ সালে এর অর্থ কোনও জাভা প্রকল্পের অর্থ হওয়া উচিত ))
জোনিক

1
@ কাউয়ান একা "0" নিয়ে কি সমস্যা আছে? উইল চারম্যাচার.ইস ('0')। ট্রিমলিডিংফ্রোম ("0"); "0" বা খালি স্ট্রিং ফিরিয়ে দেবেন?
ফুনউন

@ ফুনন: আমি কেবল এটি পরীক্ষা করেছি; এটি খালি স্ট্রিং প্রদান করে।
স্টেফান202


5

আপনি ঠিক করতে পারেন: String s = Integer.valueOf("0001007").toString();


2
আলফানিউমারিক পরিচালনা করবে না।
স্ল্যামন

4

অ্যাপাচি কমন্স StringUtilsক্লাস ব্যবহার করুন :

StringUtils.strip(String str, String stripChars);

2
সতর্কবার্তা! এটি শীর্ষস্থানীয় এবং শেষ শূন্যগুলি ফেলা করবে, যা আপনি যা চান তা নাও হতে পারে।
জেনস ব্যানম্যান

18
আপনি কেবল স্ট্রিংইটিলস.স্ট্রিপস্টার্ট () ব্যবহার করে শীর্ষস্থানীয় জিরোগুলি ফেলা করতে পারেন।
জোশ রোসেন


2

গ্রুপগুলির সাথে রেজিপ্সপ ব্যবহার করা হচ্ছে:

Pattern pattern = Pattern.compile("(0*)(.*)");
String result = "";
Matcher matcher = pattern.matcher(content);
if (matcher.matches())
{
      // first group contains 0, second group the remaining characters
      // 000abcd - > 000, abcd
      result = matcher.group(2);
}

return result;

2

উত্তরের কয়েকটি হিসাবে রেগেক্স ব্যবহার করা এটি করার একটি ভাল উপায়। আপনি যদি রেজেক্স ব্যবহার করতে না চান তবে আপনি এই কোডটি ব্যবহার করতে পারেন:

String s = "00a0a121";

while(s.length()>0 && s.charAt(0)=='0')
{
   s = s.substring(1); 
}

এটি প্রচুর পরিমাণে তৈরি করতে পারে String... পরিবর্তে ম্যাজিক্র্যাফটার অ্যাপ্রোচ ব্যবহার করুন।
এক্সেলহ

1

আমি মনে করি যে এটি করা এত সহজ। আপনি শুরু থেকে স্ট্রিংটির উপর দিয়ে লুপ করতে পারেন এবং জিরোগুলি সরিয়ে না দেওয়া পর্যন্ত আপনি কোনও শূন্য চর খুঁজে পান না।

int lastLeadZeroIndex = 0;
for (int i = 0; i < str.length(); i++) {
  char c = str.charAt(i);
  if (c == '0') {
    lastLeadZeroIndex = i;
  } else {
    break;
  }
}

str = str.subString(lastLeadZeroIndex+1, str.length());

1

যদি আপনার (আমার মতো) প্রতিটি স্ট্রিংয়ের প্রতিটি "শব্দ" থেকে সমস্ত নেতৃস্থানীয় শূন্যগুলি অপসারণের প্রয়োজন হয়, আপনি নীচের উত্তরগুলিতে @ পলিজেনউব্রিকেন্টস এর উত্তরটি পরিবর্তন করতে পারেন:

String s = "003 d0g 00ss 00 0 00";
s.replaceAll("\\b0+(?!\\b)", "");

যার ফলাফল:

3 d0g ss 0 0 0

1

ব্যবহার Regexবা substring()ফাংশন ছাড়াই Stringযা নিষ্ক্রিয় হবে -

public static String removeZero(String str){
        StringBuffer sb = new StringBuffer(str);
        while (sb.length()>1 && sb.charAt(0) == '0')
            sb.deleteCharAt(0);
        return sb.toString();  // return in String
    }

0

আপনি regex সঙ্গে প্রতিস্থাপন "^0*(.*)"করতে পারে"$1"


1
আমি এখানে কেবল দেখতে পাচ্ছি সমস্যাটি হ'ল এটি একটি শূন্য '0' শূন্যস্থানে প্রতিস্থাপন করতে পারে।
দিলিপকুমার জে

0
       String s="0000000000046457657772752256266542=56256010000085100000";      
    String removeString="";

    for(int i =0;i<s.length();i++){
      if(s.charAt(i)=='0')
        removeString=removeString+"0";
      else 
        break;
    }

    System.out.println("original string - "+s);

    System.out.println("after removing 0's -"+s.replaceFirst(removeString,""));

0

আপনি যদি রেজেক্স বা বাহ্যিক গ্রন্থাগারটি ব্যবহার করতে না চান তবে। আপনি "জন্য" দিয়ে করতে পারেন:

String input="0000008008451"
String output = input.trim();
for( ;output.length() > 1 && output.charAt(0) == '0'; output = output.substring(1));

System.out.println(output);//8008451

Stringএই লুপ চলাকালীন প্রচুর 0
পরিমাণে

0

আমি কয়েকটি বেঞ্চমার্ক পরীক্ষা করেছিলাম এবং খুঁজে পেয়েছি যে দ্রুততম উপায় (খুব বেশি দূরত্বে) এই সমাধানটি হ'ল:

    private static String removeLeadingZeros(String s) {
      try {
          Integer intVal = Integer.parseInt(s);
          s = intVal.toString();
      } catch (Exception ex) {
          // whatever
      }
      return s;
    }

বিশেষত নিয়মিত প্রকাশগুলি দীর্ঘ পুনরাবৃত্তিতে খুব ধীর হয়। (আমার একটি ব্যাচজবসের দ্রুততম উপায় খুঁজে বের করা দরকার))


-2

এবং কেবল প্রথম অ-শূন্য চরিত্রের সন্ধান সম্পর্কে কী?

[1-9]\d+

এই রেজেক্স 1 এবং 9 এর মধ্যে প্রথম সংখ্যাটি অনুসরণ করে তার পরে যেকোন সংখ্যার অঙ্কের পরে, "00012345" এর জন্য এটি "12345" ফেরত দেয় । এটি সহজেই আলফানিউমেরিক স্ট্রিংয়ের জন্য মানিয়ে নেওয়া যায়।


এটি পরে শূন্যকে অনুমতি দেবে না।
নিশান্ত ডঙ্গারে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.