如何在另一个特定字符之后匹配特定字符

How to match specific character after another specific character

我需要在另一个特定字符之后查找特定字符。例如

jhony@domain.com

我需要找到第一次出现的“.”。直到单词 end 第一次出现“@”

之后

我试过这个模式,但没有成功:

(?<=@)([.])$

https://regex101.com/r/sTRpxp/1

我认为没有必要回顾。 我很少使用它们,因为我发现它们很难理解。有时你不得不使用它们,但你可以尝试以下方法:

@.*?(\..*)$
  • 首先匹配文字 @
  • 那就什么都拿,但不要贪心:.*?
  • 用方括号开始第一个捕获组(...)
  • \.
  • 匹配文字点
  • 然后就是剩下的 .*

重要提示: 不贪心使用 .*? 允许您在 第一次 出现文字时开始捕获组点。如果您使用 .*(贪婪),则无法捕获 .co.uk 之类的域,您只能捕获 .uk.

对于以下测试数据:

jhony@domain.com
john.doe@company.co.uk

您将在第一个捕获组中获得 .com.co.uk

Regex101 示例:https://regex101.com/r/8iYCJ9/1

您当前的问题可能可以通过不同的方式解决,但这是您所要求的:

(?<=@\w{0,255})\.

看到主机部分的最大长度是 said to be 255 个字符,{0,255} 似乎能够匹配 @. 之间尽可能多的字符必要的。

regex demo详情

  • (?<=@\w{0,255}) - 正 constrained-width 后视,匹配紧接在 @ 之前的位置,然后是 0 到 255 个字符
  • \. - 一个点。

替代正则表达式:

"(?<=@\w{1,100})(\.\S+)"

上下文和测试平台中的正则表达式:

public static void main(String[] args) {
    String input = "jhony@domain.com";

    Pattern pattern = Pattern.compile("(?<=@\w{1,100})(\.\S+)");
    Matcher matcher = pattern.matcher(input);
    if(matcher.find()) {
        System.out.println(matcher.group(1));
    }
}

不带“组号”的匹配:

public static void main(String[] args) {
    String input = "jhony@domain.com";

    Pattern pattern = Pattern.compile("(?<=@\w{1,100})\.\S+");
    Matcher matcher = pattern.matcher(input);
    if(matcher.find()) {
        System.out.println(matcher.group());
    }
}

输出:

.com

有关 Pattern 'Special constructs' 的更多信息,请参见此处: https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html