如何检查一个字符串是否包含另一个字符串中表示的一组字符中的任何字符?

24

如何检查一个字符列表是否在字符串中,例如“ABCDEFGH”,如何检查其中任何一个是否在字符串中。


你的意思是想检查某个字符串是否包含列表中的字符吗? - Alex Kreutznaer
在提出这样的问题之前,可能应该先到其他地方看看。 - sage88
我认为OP想问正则表达式,但不知道如何提问。 - Mawia
7个回答

43

在Java中使用正则表达式可以通过str.matches(regex_here)来检查。

Java中的正则表达式

例如:

    if("asdhAkldffl".matches(".*[ABCDEFGH].*"))
    {
        System.out.println("yes");
    }

区域敏感性怎么样? - mre

29

使用StringUtils.containsAny(String, String)是实现这一功能最简洁的方式。

package com.sandbox;

import org.apache.commons.lang.StringUtils;
import org.junit.Test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class SandboxTest {

    @Test
    public void testQuestionInput() {
        assertTrue(StringUtils.containsAny("39823839A983923", "ABCDEFGH"));
        assertTrue(StringUtils.containsAny("A", "ABCDEFGH"));
        assertTrue(StringUtils.containsAny("ABCDEFGH", "ABCDEFGH"));
        assertTrue(StringUtils.containsAny("AB", "ABCDEFGH"));
        assertFalse(StringUtils.containsAny("39823839983923", "ABCDEFGH"));
        assertFalse(StringUtils.containsAny("", "ABCDEFGH"));
    }

}

Maven依赖:

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.5</version>
    </dependency>

2
@advocate 可能是因为它没有构建在Java中。您需要下载Apache Commons Lang才能获取它。http://commons.apache.org/proper/commons-lang/ 确保将其添加到您的类路径中。 - Daniel Kaplan
谢谢!对于其他人,您需要解压缩下载包(我建议在您的项目文件夹中)。在Eclipse中右键单击您的项目->构建路径->配置构建路径->添加外部Jars->选择commons lang jars。您还需要在导入语句中使用正确的版本号:import org.apache.commons.lang3.StringUtils; - fIwJlxSzApHEZIl
4
这应该是被采纳的答案——它更加简洁、简单,并且在我的测试中,使用预编译的 RegEx(例如:Pattern.compile(".?[<>:"/\|?]+?.*"))验证 Windows 文件名中是否包含保留字符时,StringUtils.containsAny 的运行速度大约快了 6 倍。 - Vitali Tchalov

4

From Guava: CharMatcher.matchesAnyOf

private static final CharMatcher CHARACTERS = CharMatcher.anyOf("ABCDEFGH");
assertTrue(CHARACTERS.matchesAnyOf("39823839A983923"));

3
如果一个字符串变量中包含了"ABCDEFGH",则使用正则表达式解决方案并不好。如果该字符串中包含任何具有正则表达式特殊意义的字符,则该解决方案将无法起作用。相反,我建议您使用如下方法:
    Set<Character> charsToTestFor = "ABCDEFGH".chars()
            .mapToObj(ch -> Character.valueOf((char) ch))
            .collect(Collectors.toSet());
    String stringToTest = "asdhAkldffl";
    boolean anyCharInString = stringToTest.chars()
            .anyMatch(ch -> charsToTestFor.contains(Character.valueOf((char) ch)));
    System.out.println("Does " + stringToTest + " contain any of " + charsToTestFor + "? " + anyCharInString);

使用字符串 asdhAkldfflABCDEFGH,该代码片段输出:

asdhAkldffl 是否包含 [A, B, C, D, E, F, G, H] 中的任意字符? true


当我回答时,我没有考虑到这一点。这是一个很好的观点。有办法解决它。你可以用“\”转义特殊字符。我并不是说这是“另一方面”,我只是让其他人知道每个角度。 - Daniel Kaplan

1

使用Pattern和Matcher可以实现这一点,

Pattern p = Pattern.compile("[^A-Za-z0-9 ]");
Matcher m = p.matcher(trString);
boolean hasSpecialChars = m.find();

1
我认为这是一个新手问题,所以我会给你我能想到的最简单的方法:使用indexOf。如果你愿意,你可以尝试更复杂的版本,包括正则表达式

-2

这似乎是一道作业题... -_-

你可以使用String.contains()函数。
例如:

"string".contains("a");
String str = "wasd";
str.contains("a");

但是您需要为每个要检查的字符调用一次它。


这是一种低效的解决方案,使用正则表达式更好。 - Pradeep Simha
2
我进行了编辑,因为如果你还不了解正则表达式,这样更简单易懂。 - EAKAE
如果你想使用这种方法检查数据是否仅包含数字,那么祝你好运。 - Alex
2
即便如此,那也不是一个可以接受的回答态度。 - Evren Ozturk
2
问题要求提供一个字符列表,而不是单个字符。 - JGFMK

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