基于Pattern的Java字符串格式

时间:2014-01-18 05:21:50

标签: java regex pattern-matching

我有没有办法根据regEx模式格式化字符串。那是我可以有一个字符串并应用该模式。一个完美的例子是电话号码或信用卡。例如,如果我有这个功能:

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

3 个答案:

答案 0 :(得分:1)

好的,这个解决方案怎么样:

this post中为@Code Jockey提供信用,您可以使用此正则表达式匹配并格式化有效电话号码。

这个正则表达式有很多变化,它非常彻底而且灵活。请参阅示例链接。非常聪明。

正则表达式:

^\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

如果匹配为false,(不是有效的电话号码),如示例所示:

123456
1234567
1234567890
12

您将使用另一个正则表达式来匹配和格式化残留物 - 例如:

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

替换:

($1) $2-$3

示例:

http://regex101.com/r/wY3kP2

个人注意:我不知道您为什么要匹配并格式化无效电话号码。我个人会使用第一个正则表达式格式化有效数字,然后在错误匹配时请求用户输入有效数字。但是,我确实理解,由于不知道确切的情况或应用程序,可能需要或以某种方式格式化无效的电话号码。

答案 1 :(得分: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;
 }
}

您可以根据需要进行修改

答案 2 :(得分: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