正则表达式:如果在模式之前出现不需要的子模式,如何检测模式?

时间:2017-12-08 07:03:32

标签: java regex string

我是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个小写或大写字符,但是我对如何在字符串中检测到这一点感到绝望。

2 个答案:

答案 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

基本上,"夹心"可选事物中需要的东西。

在此处试试:https://regex101.com/r/VT4t2x/1

答案 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