如何在字符串中查找两个特定字符?

时间:2014-11-04 22:57:54

标签: java string design-patterns char

String abc = "||:::|:|::";

如果有两个|和三个:出现,它应该返回true 我不确定如何使用“正则表达式”或者它是否是正确的使用方法。 abc字符串中没有特定的模式。

5 个答案:

答案 0 :(得分:0)

假设您正在寻找两个' |'对于三个人来说,一个接一个,一个接一个地说:' 一个跟随另一个。使用以下单个正则表达式。

".*||.*:::.*"

如果您只想查看字符的存在及其与订单无关,请使用String.matches方法使用带有逻辑AND的两个正则表达式

".*|.*|.*"

".*:.*:.*:.*"

这是cheat sheet for regular expressions。它的学习相当简单。查看文档中的组和量词,以了解上述表达式。

答案 1 :(得分:0)

使用正则表达式会是一个坏主意,特别是如果它们没有特定的顺序。创建一个函数,计算字符在字符串中的次数,并使用:

public int count(String base, char toFind)
{
    int count = 0;
    char[] haystack = base.toCharArray();
    for (int i = 0; i < haystack.length; i++)
        if (haystack[i] == toFind)
            count++;
    return count; 
}

String abc = "||:::|:|::";
if (count(abc,"|") >= 2 && count(abc,":") >= 3)
{
    //Do some code here
}

答案 2 :(得分:0)

我最喜欢的搜索字符串中字符数的方法是int num = s.length() - s.replaceAll("|","").length();你可以为这两个字符执行此操作并测试这些字符。

答案 3 :(得分:0)

如果您想在一个正则表达式中测试所有条件,可以使用look-ahead (?=condition)

你的正则表达式看起来像

String regex =
        "(?=(.*[|]){2})"//contains two |
        + "(?=(.*:){3})"//contains three :
        + "[|:]+";//is build only from : and | characters

现在您可以将其与matches类似

一起使用
String abc = "||:::|:|::";
System.out.println(abc.matches(regex));//true

abc = "|::::::";
System.out.println(abc.matches(regex));//false

无论如何,我可以避免使用正则表达式并编写自己的方法来计算字符串中|:的数量,并检查这些数字是否大于或等于2和3.您可以使用来自apache-commonsStringUtils.countMatches,因此您的测试代码可能看起来像

public static boolean testString(String s){
    int pipes = StringUtils.countMatches(s, "|");
    int colons = StringUtils.countMatches(s, ":");
    return pipes>=2 && colons>=3;
}

public static boolean testString(String s){
    return      StringUtils.countMatches(s, "|")>=2 
            &&  StringUtils.countMatches(s, ":")>=3;
}

答案 4 :(得分:0)

尚未测试过,但这应该可行

Pattern.compile("^(?=.*[|]{2,})(?=.*[:]{3,})$");

整个字符串由?=.*读取,并检查允许的字符(|)是否至少出现两次。然后对:进行相同的操作,只需要至少匹配三次。