我的问题是最初根据一个标准拆分字符串,然后用另一个标准拆分字符串的剩余部分。我想将下面的电子邮件地址拆分为3个部分:
String email = "blah.blah_blah@mail.com";
// After splitting i want 3 separate strings (can be array or accessed via an Iterable)
string1.equals("blah.blah_blah");
string2.equals("mail");
string3.equals("com");
我知道我可以先根据@
将其拆分为两个,然后再基于.
拆分第二个字符串,但无论如何都要在一步中完成此操作?我不介意String#split
方法或使用Pattern
和Matcher
的正则表达式方法。
答案 0 :(得分:1)
在分割中使用此正则表达式:
dev.text = "blah"
它会在@|[.](?!.*[@.])
之后的最后@
处分开.
或 (之前的那个&# 34;玉米&#34)。 Regex101 Tested
像这样使用:
@
然后String[] emailParts = email.split("@|[.](?!.*[@.])");
将是您想要的3个字符串的数组。
作为奖励,如果您希望它在emailParts
之后每个点分割(包括子域之间的那些),则删除{{ 1}}来自正则表达式末尾的字符类。它将变为@
答案 1 :(得分:0)
你似乎想分开
- @
或
- @
之后的任何点(换句话说,在它之前的某处有@
)。
如果是这种情况,您可以使用email.split("@|(?<=@.{0,1000})[.]");
,它将返回包含已分隔令牌的String[]
数组。
我使用.{0,1000}
代替.*
,因为look-behind需要在Java中有明显的最大长度,而不包括*
量词。但假设@
和.
的间隔不超过1000个字符,我们可以使用{0,1000}
代替。
答案 2 :(得分:0)
您可以使用此正则表达式:
([^@]*)@([^@]*)\.([^@\.]*)
以下是demo
以下是示例Java代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaRegex
{
public static void main(String args[])
{
// String to be scanned to find the pattern.
String line = "blah.blah_blah@mail.mail2.com";
String pattern = "([^@]*)@([^@]*)\\.([^@\\.]*)";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher m = r.matcher(line);
if (m.find())
{
System.out.println("Found value: " + m.group(1));
System.out.println("Found value: " + m.group(2));
System.out.println("Found value: " + m.group(3));
} else
{
System.out.println("NO MATCH");
}
}
}
感谢Pshemo指出前瞻性是不必要的。
答案 3 :(得分:-1)
String str = "blah.blah_blah@mail.com";
String[] tempMailSplitted;
String[] tempHostSplitted;
String delimiter = "@";
tempMailSplitted = str.split(delimiter);
System.out.println(temp[1]); //mail.com
String hostMailDelimiter = "."
tempHostSplitted = temp[1].split(hostMailDelimiter);
如果你想问我,你也可以在正则表达式中进行。 :)