在一个步骤中使用多个分隔符拆分字符串

时间:2016-03-20 22:01:39

标签: java regex string

我的问题是最初根据一个标准拆分字符串,然后用另一个标准拆分字符串的剩余部分。我想将下面的电子邮件地址拆分为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方法或使用PatternMatcher的正则表达式方法。

4 个答案:

答案 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);

如果你想问我,你也可以在正则表达式中进行。 :)