Java 匹配字符串模式

Java 匹配字符串模式,java,string,algorithm,Java,String,Algorithm,我必须比较只包含p、F或*的两个字符串,比如PPFFP和p**F*,*意味着它不关心在这个地方出现什么,它可能是F或P。因此在这个场景中,上述两个字符串的输出将为真。如果只有一个字符串包含*,您可以使用正则表达式。只需将每个*替换为[PF]: String s = "PPFFP"; if (s.matches("P[PF][PF]F[PF]") { ... } 允许在两个字符串中使用*的更基本的方法是: public static boolean matches( String s1,

我必须比较只包含
p
F
*
的两个字符串,比如
PPFFP
p**F*
*
意味着它不关心在这个地方出现什么,它可能是F或P。因此在这个场景中,上述两个字符串的输出将为真。

如果只有一个字符串包含

*
,您可以使用正则表达式。只需将每个
*
替换为
[PF]

String s = "PPFFP";
if (s.matches("P[PF][PF]F[PF]") {
    ...
}
允许在两个字符串中使用
*
的更基本的方法是:

public static boolean matches( String s1, String s2 ) {
    if (s1.length() != s2.length()) return false;
    for (int i = 0; i < s1.length(); i++ ) {
        if (s1.charAt(i) != '*' &&
            s2.charAt(i) != '*' &&
            s1.charAt(i) != s2.charAt(i)) {
            return false;
        }
    }
    return true;
}
公共静态布尔匹配(字符串s1、字符串s2){
如果(s1.length()!=s2.length())返回false;
对于(int i=0;i
这个问题有点模糊。但是,假设您需要编写一个方法

public boolean matches(String left, String right)
其中
left
仅包含p和F,而
right
也可以包含
*
以匹配任何字符

您可以通过将正确的参数转换为正则表达式来实现这一点,其中
*
替换为
[PF]
,以匹配p或F:

public boolean matches(String left, String right) {
    String regex = right.replace("*", "[PF]");
    return left.matches(regex);
}
在Java中,正则表达式只是
String
值,完全可以接受正则表达式是由其他表达式创建的字符串

如果
左侧
右侧
都可以包含
*
,请参见Frank的答案。(注意:这似乎是您的情况,但我在看到您的评论之前发布了我的答案。)创建正则表达式有一些“聪明”的方法可以做到这一点,但我认为这会使代码太混乱,所以我更喜欢循环方法。不过,我认为这会奏效:

public boolean matches(String left, String right) {
    String regex = right.replace("*", "#")
                        .replace("P", "[P\\*]")
                        .replace("F", "[F\\*]")
                        .replace("#", "[PF\\*]");
    return left.matches(regex);
}

我还没有测试过这一点。

据我所知,这可能就是您想要的:

String input_1 = "*PF*P";
String input_2 = "P**F*";
char[] input_1_chars = input_1.toCharArray();
char[] input_2_chars = input_2.toCharArray();

if(input_1.length() != input_2.length()){ // If two strings are not equal
    System.out.println("FALSE");   
}
else{
    for(int i=0;i<input_2.length();i++){
        if(input_2.charAt(i) == '*'){
            input_1_chars[i]='*'; // Copy asterisk from input 2 to indices of input 1.
        }
    }
    for(int i=0;i<input_1.length();i++){
        if(input_1.charAt(i) == '*'){
            input_2_chars[i]='*'; // Copy asterisk from input 1 to indices of input 2.
        }
    }

    input_1 = String.valueOf(input_1_chars);// Convert char array back to string.
    input_2 = String.valueOf(input_2_chars);
    if(input_1.equals(input_2)){
        System.out.println("TRUE");// If strings are equal then print True
    }
    else{
        System.out.println("FALSE");//else false
    }   
}
字符串输入_1=“*PF*P”;
字符串输入_2=“P**F*”;
char[]input_1_chars=input_1.toCharArray();
char[]input_2_chars=input_2.toCharArray();
if(input_1.length()!=input_2.length()){//如果两个字符串不相等
System.out.println(“假”);
}
否则{

对于(int i=0;iYou可以将正则表达式与字符类一起使用。请告诉我们有关此问题的更多信息。是否要“比较两个字符串”--这两个字符串从何而来?其中一个是已知常量,或者两个字符串都可能来自某个输入源?如果两者都可以来自输入,那么只能有一个字符串包含
*
,或者两者都包含?两个字符串都可以具有
*
字符串的长度是否固定为5?长度没有限制您也可以执行
“[FP]+”
@MichaelMarkidis:我不这么认为。如果一个字符串中的位置没有通配符,那么另一个字符串中的哪个字符就无关紧要了。明白了。我一开始并不完全理解OP想要什么。谢谢。看起来这会行得通的,只是如果发现长度不相等,你真的应该退出。你写的方式另外,既然OP已经说过两个字符串都可以包含
*
,我想你需要修复它,这样两个字符串都可以转换为字符数组,如果需要的话,两个数组中的字符都可以设置为
*
。我认为Frank的解决方案更有效icient,但这是一种可能对解决类似问题有用的方法。您还拼错了“星号”。好的,但我从OP中了解到,只有第二个字符串包含星号。无论如何,将更新新代码。感谢您指出这一点。