我是regex的新手,我尝试使用Java来检测以下的序列:小写,大写或数字,但不是由句点分隔的JUST数字。 限制:没有连续的时期。
我的示例字符串是:@@@951.324.1@@@foo1.bar2.123proccess.this.subString
我目前有以下正则表达式:((\p{Alnum})+\.)+(\p{Alnum})+
我试图让模式识别foo1.bar2.123proccess.this.subString
,但我的正则表达式给了我951.324.1
,因为它是我定义的模式的子模式。
我如何检测subString foo1.bar2.123proccess.this.subString
我认为一般性质是:整个返回的String应该至少有1个小写或大写字符,但是我对如何在字符串中检测到这一点感到绝望。
答案 0 :(得分:2)
[a-zA-Z\d.]*[a-zA-Z][a-zA-Z\d.]*
这可分为3个部分:
[a-zA-Z\d.]* // optional sequence of letters/numbers/dots
[a-zA-Z] // MUST have a letter
[a-zA-Z\d.]* // optional sequence of letters/numbers/dots
基本上,"夹心"可选事物中需要的东西。
答案 1 :(得分:0)
您可以使用
String rx = "\\d+(?:\\.\\d+)+|(\\p{Alnum}+(?:\\.\\p{Alnum}+)+)";
请参阅regex demo(由于regex101不支持Java POSIX字符类语法而调整的模式)
重点是匹配并跳过以点分隔的数字块,并且仅匹配并捕获您需要的内容。见Java demo:
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