提问人:deldev 提问时间:9/9/2021 最后编辑:Wiktor Stribiżewdeldev 更新时间:9/11/2021 访问量:216
如何在另一个特定字符之后匹配特定字符
How to match specific character after another specific character
问:
我需要在另一个特定字符之后找到一个特定字符。例如
[email protected]
我需要找到第一次出现的“.”,直到第一次出现“@”之后的单词末尾
我尝试了这种模式,但没有成功:
(?<=@)([.])$
答:
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
评论
result = email.substring(email.indexOf("@")).substring(email.substring(email.indexOf("@")).indexOf("."));
substring
result = email.substring(email.indexOf('.', email.indexOf('@') + 1));
'.'
'@'