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

How to match specific character after another specific character

提问人:deldev 提问时间:9/9/2021 最后编辑:Wiktor Stribiżewdeldev 更新时间:9/11/2021 访问量:216

问:

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

[email protected]

我需要找到第一次出现的“.”,直到第一次出现“@”之后的单词末尾

我尝试了这种模式,但没有成功:

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

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

Java 正则表达式 模式 匹配

评论

2赞 Scary Wombat 9/9/2021
为什么要使用正则表达式?也许改用 indexOf 和 substring?
0赞 deldev 9/9/2021
@ScaryWombat,你是对的。我使用result = email.substring(email.indexOf("@")).substring(email.substring(email.indexOf("@")).indexOf("."));
2赞 Holger 9/9/2021
不要使用重复操作。取而代之的是,使用字面意思是“在第一个之后使用第一个的索引”substringresult = email.substring(email.indexOf('.', email.indexOf('@') + 1));'.''@'

答:

2赞 Simon Oelerich 9/9/2021 #1

我认为没有必要向后看。 我很少使用它们,因为我发现它们很难理解。有时您必须使用它们,但您可以尝试以下操作:

@.*?(\..*)$
  • 首先匹配文本@
  • 然后拿走一切,但不要贪婪:.*?
  • 使用括号启动第一个捕获组(...)
  • 将文字点与\.
  • 然后是其余的.*

重要:不贪婪地使用允许您在第一次出现文字点时启动捕获组。如果你使用(贪婪),你就无法捕获像这样的域,你只会捕获。.*?.*.co.uk.uk

对于以下测试数据:

[email protected]
[email protected]

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

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

评论

0赞 Wiktor Stribiżew 9/9/2021
这对 OP 来说也一定没问题。接受的答案添加了非空格字符,,一个接一个的模式。\S+
2赞 Wiktor Stribiżew 9/9/2021 #2

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

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

看到主机部分的最大长度据说是 255 个字符,似乎能够根据需要匹配尽可能多的单词字符。{0,255}@.

请参阅正则表达式演示细节

  • (?<=@\w{0,255})- 正约束宽度后视,匹配紧跟在 和 然后是 0 到 255 个单词字符的位置@
  • \.- 一个点。

评论

1赞 Simon Oelerich 9/9/2021
在阅读您的回答时,我注意到我误解了这个问题。我只是以为他想匹配 TLD,但他只想匹配点。这应该是公认的答案。
1赞 Wiktor Stribiżew 9/9/2021
@SimonOelerich 现在,是的,这个问题听起来模棱两可。无论如何,我很高兴OP毕竟得到了解决方案。
2赞 DigitShifter 9/9/2021 #3

替代正则表达式:

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

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

public static void main(String[] args) {
    String input = "[email protected]";

    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 = "[email protected]";

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

输出:

.com

有关 Pattern 的“特殊结构”的更多信息,请访问:https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html