我正在寻找一个可以帮助我搜索电子邮件字符串列表的正则表达式,例如,如果我有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;
}
答案 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.com
和jerbauman@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/