我的字符串总是包含x或y,我必须根据以下条件进行验证
如何在不编写具有条件的复杂for循环的情况下检查这一点。有没有使用xor的解决方案,或者如果我将字符串存储为boolen或number(x = 1或者y = 0或false),它会有用吗。
答案 0 :(得分:2)
x*(yx*)?|y*(xy*)?
似乎正在做你想做的事。如果您不想接受空字符串,可以先将*
更改为+
。
简而言之:
*
是量词,意味着它之前的元素可以出现零次或多次 ?
表示之前的元素是可选的|
是OR运算符所以在x*(yx*)
x*
表示零个或多个x
个字符,这意味着它可以表示空字符串""
,x
,xx
,xxx
等等yx*
可以表示y
之后的x
字符串,其后面有y
,yx
,yxx
{ LI>
这个正则表达式试图检查字符串是否为
xxxx
,可选yxxx
部分,yyyy
,可选xyyy
部分。演示
String regex = "x*(yx*)?|y*(xy*)?";
System.out.println("xxx".matches(regex));
System.out.println("xxxy".matches(regex));
System.out.println("xxyx".matches(regex));
System.out.println("xxxyy".matches(regex));
输出:
true
true
true
false
如何在不使用条件
编写复杂for循环的情况下检查此内容
这取决于复杂的含义。像这样的循环非常简单IMO
public static boolean check(String text){
long xCounter = 0;
long yCounter = 0;
for (char ch : text.toCharArray()){
if (ch=='x') xCounter++;
else if (ch=='y') yCounter++;
else return false;//non x or y appeared
}
return xCounter < 2 || yCounter < 2;
}
答案 1 :(得分:0)
我认为没有必要在这里使用正则表达式;正则表达式编译可能比简单地遍历字符串并检查字符需要更多的运行时间。 (该帖子被标记为“表演,毕竟”)
这比我最初预期的方式写起来有点困难,但它并不可怕,它应该相当快:
public static boolean foo(String str) {
// if the string only has three characters, both can't be in it twice.
if(str.length() < 4) {
return true;
}
// To start with, assume that the first character is the main
// character (the one that appears more often). Search for the
// other one.
char needle = str.charAt(0) == 'x' ? 'y' : 'x';
int first = str.indexOf(needle, 1);
if(first == -1) {
// Didn't find the other character at all.
return true;
}
if(first == 1) {
// The first two characters are different from each other.
// What we first thought was the main character might be
// the lesser after all.
needle = str.charAt(2) == 'x' ? 'y' : 'x';
// skip unnecessary check.
first = 2;
}
return str.indexOf(needle, first + 1) == -1;
}
答案 2 :(得分:0)
嗯。我认为这对你有用:
if (str.length() < 4)
return true;
String reduction = str.replaceAll("y","");
if (reduction.length() < 2 || (str.length() - reduction.length()) < 2)
return true;
else
return false;