2014-01-18 4 views
3

Есть ли способ форматировать строку на основе шаблона regEx. То есть я могу получить строку и применить этот шаблон. Прекрасным примером может служить номер телефона или кредитная карта. Например, если бы я имел эту функцию:Форматирование строки Java на основе шаблона

public String formatNumber(String input, String patter) { 

    // What to do... 

} 

Я хотел бы описать картину в одной строке, а не делать несколько операций строки, чтобы получить вход в нужный формат.

Не то, чтобы входной сигнал мог быть не единственным входом, а только частью входа, и он все еще нуждается в форматировании.

EXAMPLE: 
------- 

Pattern = "\(\d{3}\) \d{3}-\d{4}" 

123456  => (123) 456 
1234567 => (123) 456-7 
1234567890 => (123) 456-7890 
12   => (12 
+0

Не уверен, что если [это помогает] (http://stackoverflow.com/questions/8196771/format-a-string-using-regex-in-java) – gtgaxiola

+0

Возможно стоит посмотреть ответ RegEx в этом вопросе: http://stackoverflow.com/questions/8196771/format-a-string-using-regex-in-java – Durandal

+0

Посмотрел на это, но не полностью последовал за ним. Я добавлю критерии добавления. – jjNford

ответ

0

Это то, что я могу сделать для вас

public class HelloWorld{ 

public static void main(String []args){ 
    String input = "1234567890"; 
    String patter = "(%s) %s-%s"; 
    HelloWorld hello = new HelloWorld(); 
    hello.formatNumber(input,patter); 
} 
public String formatNumber(String input, String patter) { 
    System.out.println(input); 
    System.out.println(patter); 
    System.out.println(String.format(patter,input.substring(0,3),input.substring(3,6),input.substring(6,10))); 
    return null; 
} 
} 

Вы можете изменить его в соответствии с вашими потребностями

1

Хорошо, как насчет этого решения:

Предоставление кредита @code Жокей в this post, вы можете использовать это регулярное выражение для соответствия и формата действительных номеров.

Существует много вариантов этого регулярного выражения, и оно очень тщательное, но гибкое. См. Пример ссылки. Очень умно.

Regex:

^\D*1?\D*([2-9])\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d).*$ 

Заменить:

($1$2$3) $4$5$6-$7$8$9$10 

Пример:

http://regex101.com/r/wM0nU5

Тогда, если матч является ложным, (не правильный номер телефона), так как в вашем пример:

123456 
1234567 
1234567890 
12 

Вы бы использовать другой регулярное выражение, чтобы соответствовать и форматировать инвалидов - такие, как:

(.{1,3})(.{1,3})(.{1,3}) 

Заменить:

($1) $2-$3 

Пример:

http://regex101.com/r/wY3kP2

Личное примечание : Я не знаю, почему вы хотите совместить и сформировать t a недействительный номер телефона. лично я бы использовал первое регулярное выражение для форматирования действительных номеров, а затем по ложным совпадениям, попросить пользователя ввести действительный номер. Однако я понимаю, что, не зная точную ситуацию или приложение, может возникнуть необходимость или исключение, чтобы каким-либо образом форматировать неверный номер телефона.

0

Вам не нужно применять регулярное выражение, вы можете просто отфильтровать ввод.

Я создал образец приложения, надеюсь, это будет полезно!

MainActivity.java

package com.mehuljoisar.d_asyoutypeformatter; 

import android.os.Bundle; 
import android.app.Activity; 
import android.text.InputFilter; 
import android.text.Spanned; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.EditText; 

public class MainActivity extends Activity { 

    private EditText etCellNumber; 

    private InputFilter mCellNumFilter = new InputFilter() { 

     @Override 
     public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 

      Log.d("dstart", ""+dstart); 
      if (source.length() > 0) { 

       if (!Character.isDigit(source.charAt(0))) 
        return ""; 
       else { 
        if (dstart == 0) { 
         return "(" + source; 
        } 
        else if (dstart == 3) { 
         return source + ") "; 
        } 
        else if (dstart == 9) 
         return "-" + source; 
        else if (dstart >= 14) 
         return ""; 
       } 

      } else { 

      } 

      return null; 

     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     etCellNumber = (EditText)findViewById(R.id.etCellNumber); 
     etCellNumber.setFilters(new InputFilter[] { mCellNumFilter }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 


<EditText 
    android:id="@+id/etCellNumber" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:inputType="phone" 
    android:hint="enter cell number" /> 

Скриншоты:

enter image description here enter image description here enter image description here enter image description here

+0

Он работает для чисел с '1', например 1 (800) 234-3345? просто любопытно. loos, как классное приложение. :) – MElliott

+1

Я думаю, что это именно то, что jjNford пытался избежать –

+1

@MElliott: Это не сработает, так что это идеальный кусок кода. Я реализовал «фильтр» в соответствии с его упомянутым требованием ' \ (\ d {3} \) \ d {3} - \ d {4} "'. –

Смежные вопросы