匹配字符串模式

时间:2016-06-22 06:25:22

标签: java string algorithm

我必须比较仅包含PF*的两个字符串,例如PPFFPP**F**表示它不包含关注这个地方的内容可能是F或P.所以在这种情况下输出对于上面两个字符串都是正确的。

3 个答案:

答案 0 :(得分:3)

如果只有一个字符串包含*,则可以使用正则表达式。只需将*替换为[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;
}

答案 1 :(得分:1)

问题有点模糊。但是,我们假设您需要编写方法

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值,并且正则表达式是由其他表达式创建的字符串完全可以接受。

如果leftright都包含*,请参阅Frank的回答。 (注意:这似乎是你的情况,但我在看到你的评论之前发布了我的答案。)有&#34;聪明&#34;如何通过创建一个正则表达式来做到这一点,但我相信它使代码太乱,所以我更喜欢循环方法。我认为这会奏效:

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

我还没有测试过这个。

答案 2 :(得分:1)

根据我的理解,这可能就是你要找的东西:

@previous_person

public async Task<bool> WriteFileAsync<T>(string key,T value) { var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(key, CreationCollisionOption.ReplaceExisting); // serialize using(MemoryStream ms = new MemoryStream()) { try { var serializer = new DataContractSerializer(value.GetType()); serializer.WriteObject(ms, value); ms.Position = 0; StreamReader reader = new StreamReader(ms); var content = reader.ReadToEnd(); await FileIO.WriteTextAsync(file, content); return true; } catch (Exception e) { return false; } } } public async Task<T> ReadFileAsync<T>(string key) { var file = await ApplicationData.Current.LocalFolder.GetFileAsync(key); if(file == null) return default(T); var textContent = await FileIO.ReadTextAsync(file); // Deserialize using (StringReader reader = new StringReader(textContent)) { using (XmlReader xmlReader = XmlReader.Create(reader)) { var serializer = new DataContractSerializer(typeof(T)); T theObject = (T)serializer.ReadObject(xmlReader); return theObject; } } // using (MemoryStream ms = new //MemoryStream(Encoding.Unicode.GetBytes(textContent))) //{ // try // { // var serializer = new DataContractSerializer(typeof(T)); // return (T)serializer.ReadObject(ms); //} // catch (Exception e) //{ //return default(T); // } // } }

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 } }