忽略大小写匹配正则表达式中的字符串

13

我需要匹配数组中不以"KB"字符串开头的字符串。 我尝试了这个

String[] ar = {"KB_aaa","KB_BBB", "K_CCC", "!KBD", "kb_EEE", "FFFF"};
Pattern p = Pattern.compile("[^(^KB)].*");

for(String str : ar)
{
    Matcher m = p.matcher(str);
    if(m.matches())
         System.out.println(str);
}

但它仍然不匹配 "K_CCC"。


1
相关线程:http://stackoverflow.com/questions/7659449/jdbc-get-table-list-calling-method-gettables-of-databasemetadata-with-advanced-t - KV Prajapati
7个回答

36

我不会把正则表达式用于所有情况。

for(String str : ar)
{
    if(!str.toUpperCase().startsWith("KB"))
        System.out.println(str);
}

因为它不仅可以是KB,还可以是复杂的表达式,所以现在我需要这个 :) - Arsen Alexanyan
5
那是区分大小写的。我想他想要一个不区分大小写的匹配。 - Jon
1
@Jon和其他人:你们明白了。将条件更改为!str.toUpperCase().startsWith("KB")并不太困难! - adarshr

28

从你的问题陈述方式来看,我不确定你是想要大小写敏感还是不敏感。这个正则表达式:

(?i)[^k][^b].*

使用标志符 (?i) 可以关闭大小写敏感性,并且应该满足您的需求。


3
老实说,我认为这是正确答案,我认为问题更广泛的意义在于如何告诉正则表达式引擎忽略大小写。 - user1172468
这不是正确的答案。您的模式将无法匹配类似 aw234 或 vj2345 的字符串。 - VHS

11
    String[] ar = {"KB_aaa","KB_BBB", "K_CCC", "!KBD", "kb_EEE", "FFFF"};
    Pattern p = Pattern.compile("^KB.*", Pattern.CASE_INSENSITIVE);

    for(String str : ar)
    {
        Matcher m = p.matcher(str);
        if(!m.matches())
             System.out.println(str);
    }

8
一个匹配任何不以KB开头的正则表达式是:
^(?!KB).*

使用Java实现:

if (str.matches("^(?!KB).*$")) ...

6

不应该在任何地方都使用正则表达式,只需创建一个简单的检查:

for (String str : ar)
{
    if (!str.toLowerCase().startsWith("kb"))
        System.out.println(str);
}

我认为,即使在你的情况下不需要性能优化,这种方法在性能方面也更好:

public static boolean accept(String name)
{
    if (name.length() < 2) return true;
    String sub = name.substring(0, 2);
    return !sub.equalsIgnoreCase("KB");
}

别人对这种第二种工作方式有什么看法?

不,我需要使用正则表达式 :) 这只是一个简单的例子,以便不匹配以KB开头的字符串。 - Arsen Alexanyan

4

使用正则表达式(?i)^(?!kb).*进行大小写不敏感的匹配。此表达式将避免匹配KB234、Kb*432、kB2343和kb23445。


0

这是一段代码片段,可以帮助理解 String.matches 函数中忽略大小写的方法,请使用此[链接][1]获取更多详细信息。

String stringToSearch = "Four score and seven years ago our fathers ...";

// this won't work because the pattern is in upper-case
System.out.println("Try 1: " + stringToSearch.matches(".*SEVEN.*"));

// the magic (?i:X) syntax makes this search case-insensitive, so it returns true
System.out.println("Try 2: " + stringToSearch.matches("(?i:.*SEVEN.*)"));
Try 1: false
Try 2: true

[1]: http://alvinalexander.com/blog/post/java/java-how-case-insensitive-search-string-matches-method/#:~:text=Solution%3A%20Use%20the%20String%20matches,must%20match%20the%20entire%20string.)

[1]:{{link1:http://alvinalexander.com/blog/post/java/java-how-case-insensitive-search-string-matches-method/#:~:text=Solution%3A%20Use%20the%20String%20matches,must%20match%20the%20entire%20string.}})


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