如何搜索特定格式的电子邮件列表?

时间:2015-10-22 19:02:49

标签: android regex android-layout android-fragments android-search

我正在寻找一个可以帮助我搜索电子邮件字符串列表的正则表达式,例如,如果我有arraylist列出了几封电子邮件,那么:firstname.lastname@company.com,{{ 1}} 我想通过它们进行搜索,以便在我的过滤器中添加firstname1.lastname1@company.com时,它会显示rst name1,我有过滤器代码,它会搜索每个匹配的字母。但是我想修改它并让它在点之前或之后搜索字符"。"用正则表达式。我该怎么办呢? 这是我的过滤搜索代码:

firstname1.lastname1@company.com

其中

protected synchronized FilterResults performFiltering(CharSequence constraint) {

                FilterResults results = new FilterResults();

                if (constraint != null && constraint.length() > 0) {

                    ArrayList<Integer> filterList = new ArrayList<>();

                    int iCnt = listItemsHolder.Names.size();
                    for (int i = 0; i < iCnt; i++) {
                        if(listItemsHolder.Types.get(i).toString().indexOf("HEADER_")>-1){
                            continue;
                        }
                        if (listItemsHolder.Names.get(i).toLowerCase().contains(constraint.toString().toLowerCase())) {
                            if(filterList.contains(i))
                                continue;

                            filterList.add(i);

                        }

                    }

                    results.count = filterList.size();

                    results.values = filterList;
                }else {

                    results.count = listItemsHolder.Names.size();

                    ArrayList<Integer> tList = new ArrayList<>();
                    for(int i=0;i<results.count;i++){
                        tList.add(i);
                    }

                    results.values = tList;

                }

                return results;
            }


            //Invoked in the UI thread to publish the filtering results in the user interface.
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                ArrayList<Integer> resultsList = (ArrayList<Integer>)results.values;
                if(resultsList != null) {
                    m_filterList = resultsList;
                }
                notifyDataSetChanged();
            }
        }

包含class ListItemsHolder { public ArrayList<String> Names; }

格式的所有必要名称

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以用.*\..*

替换空格

例如,jer ld的输入将变为jer.*\..*ld并且将匹配&#34; jerry.seinfeld&#34; -

注意它不会匹配&#34; jerald.melberg&#34; - 因为&#39; jer&#39;和&#39; ld&#39;没有被&#39;分开。&#39; - 这就是你想要的吗?

正则表达式的说明 - 单词&#34;零个或多个字符(.*),后跟点(\.),后跟零个或多个字符(.*) &#34;

在您的代码中:

// just once before the loop:
String regex = constraint.replaceAll("[ .]+", ".*\..*")+".*@";
Pattern pattern = Pattern.compile(regex, CASE_INSENSITIVE);

// then in the loop,
// instead of:
// if (listItemsHolder.Names.get(i).toLowerCase().contains(constraint.toString().toLowerCase())) {
// do instead:
if (pattern.matcher(listItemsHolder.Names.get(i)).matches()) { ...

答案 1 :(得分:1)

您没有明确定义此过滤器的敏感程度,因此我们要说我们要过滤每个包含给定字符串的电子邮件(如果有没有空格的char序列)或每个包含每个部分的电子邮件字符串(空格作为部分之间的分隔符)。

没有REGEX:

例如,您可以尝试使用以下内容:

boolean itFit; //additional variable
List<String> results;

if (constraint != null && constraint.length() > 0) {

    ArrayList<Integer> filterList = new ArrayList<>();

    int iCnt = listItemsHolder.Names.size();
    for (int i = 0; i < iCnt; i++) {
        itFit = true;     // default state of itFit is ture,
        if(listItemsHolder.Types.get(i).toString().indexOf("HEADER_")>-1){
            continue;
        }
        for(String con : constraint.toString().split("\\s")) {   // constraint as string is splitted with space (\s) as delimiter, the result is an array with at least one element (if there is no space)
            if (!listItemsHolder.Names.get(i).toLowerCase().contains(con.toLowerCase())) {
                itFit = false;    // if email doesn't contains any part of splitted constraint, the itFit value is changed to false 
            }

        }
        if(itFit && !filterList.contains(i)){   // if itFit is true, add element to list
            filterList.add(listItemsHolder.Names.get(i));
        }
    }

    results = filterList;
}

我用List<String>测试了这段代码,所以可能与你的代码有些不同,但它对我有用。它也只是一个例子,可以用另一种方式轻松实现。我只是想做太多改变你的代码。

WITH REGEX:

添加小方法来创建正则表达式模式:

public String getRegEx(CharSequence elements){
    String result = "(?i).*";
    for(String element : elements.toString().split("\\s")){
        result += element + ".*";
    }
    result += "@.*";  // it will return String like "(?i).*j.*bau.*"
    return result;
}

你可以改变:

if (listItemsHolder.Names.get(i).toLowerCase().contains(constraint.toString().toLowerCase())) {

成:

if (listItemsHolder.Names.get(i).matches(getRegEx(constraint))) {

但是,此正则表达式不会包含\.部分,因此它不是强制性的,并且输入j bau它将匹配jeff.bauser@company.comjerbauman@comp.com。但它可以很容易地改变,正如我上面所写,它没有明确定义它应该如何过滤名称,我也不确定这样的电子邮件包含多少部分,以及你想要允许什么样的输入。使用此方法,您还可以键入f name l name,它会找到firstname1.lastname1@company.com

答案 2 :(得分:0)

假设您要传递最多两个参数。

我假设你提交了'rst name1'并希望找到'firstname1.lastname1@company.com'。你想要的正则表达式是:

.*rst.*\..*name1.*\@

说明:

regex:   .*   rst   .*    \.  .*   ast   .*     \@
matches: fi   rst   name  .   l    ast   name   @

如果只有一个约束,'rst',那么你想要:

.*rst.*\@

伪代码(未经测试):

arrayOfConstraintParts = constraint.split(" ");  // explode the constraint into an array of constraints
if (arrayOfConstraintParts.length >= 2) {        // If you have at least 2 constraints
    regex = ".*" . arrayOfConstraintParts[0] . ".*\..*" . arrayOfConstraintParts[1] . ".*\@";
} else {                                         // If you have only 1 constraint
    regex = ".*" . arrayOfConstraintParts[0] . ".*\@";
}

我觉得这很有用:https://regex101.com/