在WebViewClient中使用Java模式正则表达式从解码的mailto中提取信息

在WebViewClient中使用Java模式正则表达式从解码的mailto中提取信息,java,android,regex,android-webview,webviewclient,Java,Android,Regex,Android Webview,Webviewclient,我使用android API 19在webview中嵌入网站,在这里我遇到了这样一个问题,当用户单击链接mailto时。我想提取信息,并启动发送意图的操作 String firstUrl = "mailto:abc@test.com.kh"; String secondUrl = "mailto:abc@test.com.kh?subject=Request%20to%20create%20a%20new%20listing&body=To%20create%20or%20update%

我使用android API 19在webview中嵌入网站,在这里我遇到了这样一个问题,当用户单击链接mailto时。我想提取信息,并启动发送意图的操作

String firstUrl = "mailto:abc@test.com.kh";
String secondUrl = "mailto:abc@test.com.kh?subject=Request%20to%20create%20a%20new%20listing&body=To%20create%20or%20update%20your%20listing%20on%20cambodiastaging.yoolk.com";
所以我想匹配并得到这样的数据

email    #=> abc@test.com.kh
subject  #=> Request%20to%20create%20a%20new%20listing
body     #=> To%20create%20or%20update%20your%20listing%20on%20cambodiastaging.yoolk.com
以下是我的尝试

"^mailto:(^?)\\?{0,1}" #=> group1=abc@test.com.kh for both url
我要寻找的最佳答案是匹配的正则表达式模式:

  • “邮寄:abc@test.com.kh2"
  • “邮寄:abc@test.com.kh?主题=请求%20到%20创建%20a%20新建%20列表和正文=到%20创建%20或%20更新%20您的%20列表%20在%20cambodiastaging.yoolk.com上”
  • “mailto:mailto:abc@test.com.kh?主体=主体&主体=主体”
  • “mailto:mailto:abc@test.com.kh正文=正文和主题=主题和抄送=abc@me.com&密件抄送=aaa@me.com"

如果您的
secondUrl
总是采用相同的格式(mailto、subject、body),则可以使用
String.split()
三次

  • 首先用
    拆分
    第二个URL
    ,并获取第一个元素。它将是电子邮件ID
  • 采取上述步骤的第[1]个元素,并使用
    再次拆分。现在,第[0]个元素是subject,另一个元素是body

    String mailId=secondUrl.split(“\\?”)[0];
    字符串subject=secondUrl.split(\\?)[1]。split(&)[0];
    字符串正文=secondUrl.split(\\?”[1]。split(&“)[1]


  • 这不是最好的答案,但我得到了这个工作,现在为我的url模式上面

    String mailToRegexp = "^mailto:([^?]+)\\?{0,1}(?:subject=(.+)&body=(.+)){0,1}";
    Pattern mailToPattern = Pattern.compile(mailToRegexp);
    Matcher mailToMatcher = mailToPattern.matcher(url);
    
    if (mailToMatcher.find()) {
         String email = mailToMatcher.group(1);
         String subject = mailToMatcher.group(2);
         String body = mailToMatcher.group(3);
    
         Intent intent = new Intent(Intent.ACTION_SEND);
         intent.setType("message/rfc822");
         intent.putExtra(Intent.EXTRA_EMAIL, new String[] {email});
         if (subject != null) {
             intent.putExtra(Intent.EXTRA_SUBJECT, URLDecoder.decode(subject));
         }
         if (body != null) {
             intent.putExtra(Intent.EXTRA_TEXT, URLDecoder.decode(body));
         }
    
         startActivity(Intent.createChooser(intent, "Email To:"));
    }
    

    如果模式url更改“subject”和“body”的顺序或添加类似“cc”的内容,则此正则表达式将中断。

    是的,但这不是我想要的最佳答案。我希望它是灵活的,因为mailto链接彼此不同。就像“主体”和“身体”的顺序一样。