我是Regex的新手,我正在尝试使用Java检测一个序列:小写,大写或数字,但不仅是数字被时期分开。限制:没有连续的时期。
我拥有的示例字符串是: @@@951.324.1@@@foo1.bar2.123proccess.this.subString
我当前有以下正则言论: ((p{Alnum})+.)+(p{Alnum})+
我试图让模式识别 foo1.bar2.123proccess.this.subString
,但是我的正则给我951.324.1
,因为它是我定义的模式的子图案。
我将如何检测子弦foo1.bar2.123proccess.this.subString
我会想象一般的性质是:整个返回的字符串应该至少具有1个小写或大写字符,但是我对如何在字符串中检测到这一点,我无可救药。
[a-zA-Zd.]*[a-zA-Z][a-zA-Zd.]*
这可以分为3个部分:
[a-zA-Zd.]* // optional sequence of letters/numbers/dots
[a-zA-Z] // MUST have a letter
[a-zA-Zd.]* // optional sequence of letters/numbers/dots
基本上是可选事物中需要的"三明治"。
在这里尝试:https://regex101.com/r/vt4t2x/1
您可以使用
String rx = "\d+(?:\.\d+)+|(\p{Alnum}+(?:\.\p{Alnum}+)+)";
请参阅REGEX演示(根据Regex101不支持Java Posix字符类语法,调整了模式)
重点是匹配和跳过点分离的数字块,只匹配并捕获所需的东西。请参阅Java演示:
String s = "@@@951.324.1@@@abc.123";
String rx = "\d+(?:\.\d+)+|(\p{Alnum}+(?:\.\p{Alnum}+)+)";
Pattern pattern = Pattern.compile(rx);
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
if (matcher.group(1) != null) {
System.out.println(matcher.group(1));
}
} // => abc.123