使用 Android 模式和匹配器类(正则表达式)

Posted

技术标签:

【中文标题】使用 Android 模式和匹配器类(正则表达式)【英文标题】:Using Android Pattern and Matcher class (Regex) 【发布时间】:2016-04-25 21:17:35 【问题描述】:

我刚刚学习了 android,但我的任务是帮助我的实习项目。

假设我有以下详细信息:

Fonia Taylo
Product Manager

foniataylo@gmail.com
98706886

根据我上面的详细信息,我想将它传递到一个类中,然后我可以使用正则表达式过滤掉电子邮件地址,并将这个过滤掉的电子邮件地址传递给 EditText。

我搜索了很多关于正则表达式的教程,尤其是关于 Android Pattern 和 Matcher 类的教程。

但我发现的所有示例仅用于验证 仅在 EditText 字段中输入的文本。

我需要做的是:

    如上所示验证整个文本 使用正则表达式过滤掉电子邮件地址(并删除其余文本) 将此电子邮件地址传递给 EditText

目前下面是我的班级:

public class RegexOCR1 extends Activity 

    private Pattern pattern;
    private Matcher matcher;

    private String recognizedText, textToUse;

    private static final String EMAIL_PATTERN =
            "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
                    + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]2,)$";


    @Override
    protected void onCreate(Bundle savedInstanceState) 
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_createcontact);

        // Getting the path of the image from another class
        Bundle extras = this.getIntent().getExtras();
        recognizedText = extras.getString("TEXT");
        textToUse = recognizedText;

    

    @Override
    public void onConfigurationChanged(Configuration newConfig) 
        super.onConfigurationChanged(newConfig);
        setContentView(R.layout.usetext);
        showText();
        //Log.i(TAG, "onConfigChanged");
    

    private void showText()
        //Log.i(TAG, "ShowText");
        Intent intent = new Intent(this, CreateContactActivityOCR.class);
        startActivity(intent);
    

    public EmailValidator() 
    Pattern pattern = Pattern.compile(EMAIL_PATTERN);
    Matcher matcher = pattern.matcher(textToUse);
    if (matcher.find())
    
        String email = textToUse.substring(matcher.start(), matcher.end());


     else 
        // TODO handle condition when input doesn't have an email address
    
    

    public boolean validate(final String hex) 

        matcher = pattern.matcher(hex);
        return matcher.matches();

    

如您所见,它几乎不完整。我想将“textToUse”传递给正则表达式验证,然后继续执行上述功能。

编辑:

以下方法后:

public EmailValidator() 
        Pattern pattern = Pattern.compile(EMAIL_PATTERN);
        Matcher matcher = pattern.matcher(textToUse);
        if (matcher.find())
        
            String email = textToUse.substring(matcher.start(), matcher.end());


         else 
            // TODO handle condition when input doesn't have an email address
        
        

提取电子邮件地址;然后如何将提取的电子邮件地址通过意图传递给 另一个类中的 EditText

如果有任何想法,请告诉我如何更改我的代码。谢谢!

【问题讨论】:

【参考方案1】:

下面是一些提取与模式匹配的文本的代码:

Pattern pattern = Pattern.compile(EMAIL_PATTERN);
Matcher matcher = pattern.matcher(inputString);
if (matcher.find()) 
    String email = inputString.substring(matcher.start(), matcher.end());
 else 
    // TODO handle condition when input doesn't have an email address

【讨论】:

非常感谢您的回复~我会测试一下:D 嗨@kris larson,我是否将“inputString”替换为“textToUse”? 是的,不管有什么地方有嵌入电子邮件的字符串。 我找到了与您类似的答案:***.com/questions/4662215/…。对于那个答案,他们打印出结果。但是对于我的情况,从您的方法中提取文本后,您知道如何通过意图将此结果传递给 EditText 吗?我尝试了几种方法,但都失败了。 p.s.抱歉所有问题 试图理解“通过意图将结果传递到 EditText”。听起来您要么想通过电子邮件开始一项新活动,要么通过电子邮件返回上一个活动。看起来您知道如何开始活动。如果您想将电子邮件返回到之前的活动,您需要查看setResult()onActivityResult() 是如何协同工作的。也许你应该更新你的问题,在这部分提供更多细节。【参考方案2】:

在 Android SDK 中,有一个名为android.util.Patterns 的类,您可以在其中找到一些有用的正则表达式模式。

电子邮件地址:

 android.util.Patterns.EMAIL_ADDRESS

您可以像这样简单地使用它们:

String target = "";

if (android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches()) 
    // valid email address

【讨论】:

【参考方案3】:

只需首先通过创建一个单独的类将 Web 内容下载到您的 android studio 日志,如下所示:

公共类 MainActivity 扩展 AppCompatActivity

public class DownloadTsk extends AsyncTask<String, Void, String> 


    @Override
    protected String doInBackground(String... urls) 

        String result = "";
        URL url;
        HttpURLConnection urlConnection = null;

        try 
            url = new URL(urls[0]);

            urlConnection = (HttpURLConnection) url.openConnection();

            InputStream in = urlConnection.getInputStream();

            InputStreamReader reader = new InputStreamReader(in);

            int data = reader.read();

            while (data != -1) 

                char current = (char) data;

                result += current;

                data = reader.read();
            

            return result;


         catch (Exception e) 


            e.printStackTrace();
         

        return null;
    

然后你在 onCreate 方法中使用这个类并下载内容 ==> 在 Log 中测试它,最后你使用 Pattern 和 Matcher,如下所示:

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

    DownloadTsk task = new DownloadTsk();
    String result = null;

    try 
        result = task.execute("YOUR WEBSITE ADDRESS..... ").get();

        Log.i("Content", result);


     catch (Exception e) 
        e.printStackTrace();
    
    Pattern p = Pattern.compile("WHTEEVER BEFORE(.*?)WHTEEVER AFTER  ");
    Matcher m = p.matcher(result);
    while (m.find()) 
        Log.i("result", m.group(1)) ;
    

【讨论】:

以上是关于使用 Android 模式和匹配器类(正则表达式)的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 中的 Espresso 正则表达式匹配器 [重复]

Android 正则表达式

如何使用 awk 打印匹配的正则表达式模式?

正则表达式——更多匹配模式

GLib 正则表达式匹配在特定匹配和模式上给出分段错误

JavaScript正则表达式模式匹配——贪婪模式和惰性模式