Java-查找不包含特定子字符串后跟任何字符的字符串的正则表达式

3

我希望在Java中找到一个正则表达式,适用于Windows Server 2008操作系统版本且不包含"R2"。目前我正在使用的正则表达式为 -

(?i)Win\w*\s*(?i)Server\s*(2008)\s*(?!R2)\s*\w*

可能的取值:
  • Windows Server 2008 数据中心版 - 匹配正确
  • Windows Server 2008 - 匹配正确
  • Windows Server 2008 R2 数据中心版 - 不匹配
  • Windows Server 2008 r2 数据中心版 - 不匹配
  • Windows Server 2008 R2 - 匹配不正确(因为正则表达式中的\w*包括了R2
在正则表达式中,您做错了什么?

在你的前瞻后面删除\s*。你是在使用String matches()的上下文中吗? - Sebastian Proske
不是。我正在使用来自 java.util.regex 的 pattern.matcher。 但是去除 \s 对于正则表达式匹配器也起作用。 谢谢。 - appu_coder
2个回答

1
你可以考虑使用以下的正则表达式:
(?i)Win\w*\s*Server\s*(2008)(?!\sR2).*?$

查看 正则表达式演示

Java ( 演示 )

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class RegEx {
    public static void main(String[] args) {
        String s = "Windows Server 2008 datacenter";
        String r = "(?i)Win\\w*\\s*Server\\s*(2008)(?!\\sR2).*?$";
        Pattern p = Pattern.compile(r);
        Matcher m = p.matcher(s);
        while (m.find()) {
            System.out.println(m.group());
        }
    }
}

0

正则表达式匹配包含 R2 的字符串

private boolean isR2(String text) {
         return (text.toLowerCase().matches(".*r2.*"));
    }

没有正则表达式,你也可以做到

private boolean isR2(String text) {
     return (text.toLowerCase().indexOf("r2")>0);
}

两个都正确匹配您的示例:

  • Windows Server 2008 数据中心版 // false
  • Windows Server 2008 //false
  • Windows Server 2008 R2 数据中心版 //true
  • Windows Server 2008 r2 数据中心版 //true
  • Windows Server 2008 R2 //true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接