我必须比较仅包含P
,F
或*
的两个字符串,例如PPFFP
和P**F*
,*
表示它不包含关注这个地方的内容可能是F或P.所以在这种情况下输出对于上面两个字符串都是正确的。
答案 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
值,并且正则表达式是由其他表达式创建的字符串完全可以接受。
如果left
和right
都包含*
,请参阅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
}
}