Java 使用Android模式和Matcher类(Regex)

Java 使用Android模式和Matcher类(Regex),java,android,regex,android-intent,android-edittext,Java,Android,Regex,Android Intent,Android Edittext,我刚学会安卓,但我的任务是帮助我完成一个实习项目 假设我有以下详细信息: Fonia Taylo Product Manager foniataylo@gmail.com 98706886 根据上面的详细信息,我想将其传递到一个类中,这样我就可以使用正则表达式过滤掉电子邮件地址,并仅将过滤掉的电子邮件地址传递给EditText 我搜索了很多关于regex的教程,特别是关于Android模式和Matcher类的教程 但我找到的所有示例仅用于验证输入EditText字段的文本。 我需要做的是:

我刚学会安卓,但我的任务是帮助我完成一个实习项目

假设我有以下详细信息:

Fonia Taylo
Product Manager

foniataylo@gmail.com
98706886
根据上面的详细信息,我想将其传递到一个类中,这样我就可以使用正则表达式过滤掉电子邮件地址,并仅将过滤掉的电子邮件地址传递给EditText

我搜索了很多关于regex的教程,特别是关于Android模式和Matcher类的教程

但我找到的所有示例仅用于验证输入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
            }
            }
    
    提取出电子邮件地址;然后,如何将提取的电子邮件地址通过intent传递给另一个类中的编辑文本


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

    以下是一些代码,用于提取与模式匹配的文本:

    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
    }
    

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

    • 电子邮件地址:

       android.util.Patterns.EMAIL_ADDRESS
      
    您可以这样简单地使用它们:

    String target = "";
    
    if (android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches()) {
        // valid email address
    }
    

    只需首先创建一个单独的类,将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;
        }
    }
    

    非常感谢您的回复~我将测试它:DHi@kris larson,我是否将“inputString”替换为“textToUse”?是的,无论什么东西都有嵌入电子邮件的字符串。我发现了与您的答案类似的答案:。对于该答案,他们打印出结果。但是对于我的情况,在从您的方法提取文本后,您知道如何通过intent将此结果传递到EditText中吗?我尝试了几种方法,但都失败了。p.s.抱歉,f或者所有试图理解“通过意图将结果传递到编辑文本”的问题。听起来您可能想使用电子邮件启动新活动,或者使用电子邮件返回到上一个活动。看起来您知道如何启动活动。如果您想将电子邮件返回到上一个活动,则需要了解如何
    setResult()
    onActivityResult()
    一起工作。也许你应该更新你的问题,在这一部分增加一些细节。
    @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)) ;
        }
    }