كيفية إزالة الأصفار الرائدة من النص الأبجدي الرقمي؟

StackOverflow https://stackoverflow.com/questions/2800739

  •  25-09-2019
  •  | 
  •  

سؤال

لقد رأيت أسئلة حول كيفية بادئة الأصفار هنا في ذلك. ولكن ليس الاتجاه الآخر!

هل يمكن أن تقترح عليكم كيفية إزالة الأصفار الرائدة في النص الأبجدي الرقمي؟ هل هناك أي واجهات برمجة التطبيقات المدمجة أو هل أحتاج إلى كتابة طريقة لتقليص الأصفار الرائدة؟

مثال:

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
هل كانت مفيدة؟

المحلول

Regex هي أفضل أداة لهذا الوظيفة ؛ ما ينبغي أن يكون يعتمد على مواصفات المشكلة. ما يلي يزيل الأصفار الرائدة ، لكنه يترك واحدة إذا لزم الأمر (أي لن يتحول فقط "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+(?!$)", "") + "]");
}

أنظر أيضا

نصائح أخرى

يمكنك استخدام ال StringUtils فئة من Apache Commons Lang مثله:

StringUtils.stripStart(yourString,"0");

ماذا عن طريق regex:

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";

طريقة واضحة دون أي حاجة إلى regexp وأي مكتبات خارجية.

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

للذهاب مع إجابة Apache Commons من Thelost: باستخدام مكاريات الجوافة (مكتبة جافا للأغراض العامة من Google والتي أود أن أزعم أنها يجب أن تكون الآن على classpath لأي مشروع Java غير التافهة) ، وهذا سيستخدم Charmatcher:

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

استخدم Apache Commons StringUtils صف دراسي:

StringUtils.strip(String str, String stripChars);

يمكنك القيام فقط:String s = Integer.valueOf("0001007").toString();

باستخدام regexp مع مجموعات:

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;

استخدم هذا:

String x = "00123".replaceAll("^0*", ""); // -> 123

استخدام Regex كما تشير بعض الإجابات هو وسيلة جيدة للقيام بذلك. إذا كنت لا ترغب في استخدام Regex ، فيمكنك استخدام هذا الرمز:

String s = "00a0a121";

while(s.length()>0 && s.charAt(0)=='0')
{
   s = s.substring(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());

إذا كنت (مثلي) بحاجة إلى إزالة جميع الأصفار الرائدة من كل "كلمة" في سلسلة ، يمكنك تعديل إجابة polygenelubricants إلى ما يلي:

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

مما يؤدي إلى:

3 d0g ss 0 0 0

إذا كنت تستخدم Kotlin ، فهذا هو الكود الوحيد الذي تحتاجه:

yourString.trimStart('0')

يمكنك استبدال "^0*(.*)" إلى "$1" مع Regex

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

إذا كنت لا ترغب في استخدام regex أو مكتبة خارجية. يمكنك القيام به مع "for":

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

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

لقد أجريت بعض الاختبارات القياسية ووجدت أن أسرع طريقة (إلى حد بعيد) هي هذا الحل:

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

لا سيما التعبيرات العادية بطيئة للغاية في التكرار الطويل. (كنت بحاجة لمعرفة أسرع طريقة ل batchjob.)

دون استخدام 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
    }

وماذا عن مجرد البحث عن شخصية غير صفرية الأولى؟

[1-9]\d+

يجد هذا regex الرقم الأول بين 1 و 9 يليه أي عدد من الأرقام ، لذلك ل "00012345" يعود "12345". يمكن تكييفه بسهولة للسلاسل الأبجدية الرقمية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top