REGEX:如果不希望的子图案出现在模式之前,则如何检测模式



我是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

最新更新