查看您的标题,我不清楚您的意思是否必须使用 s.equals、.charAt 和 .substring。但是,如果没有,您可以为此使用正则表达式.*b[^a].*|.*b$
(谢谢ajb),如果它匹配b
后跟任何字符但是(或字符串末尾的a
特殊情况),则函数失败,例如:b
import java.util.regex.Pattern;
...
public boolean succeeds (char a, char b, String s) {
String quoteda = Pattern.quote(Character.toString(a));
String quotedb = Pattern.quote(Character.toString(b));
return !(s.matches(".*" + quotedb + "[^" + quoteda + "].*|.*" + quotedb + "$"));
}
请注意,如果字符串根本不包含,这将返回 true a
。如果您希望它在这种情况下返回 false,则必须先检查:
public boolean succeeds (char a, char b, String s) {
if (s.indexOf(b) == -1)
return false;
String quoteda = Pattern.quote(Character.toString(a));
String quotedb = Pattern.quote(Character.toString(b));
return !(s.matches(".*" + quotedb + "[^" + quoteda + "].*|.*" + quotedb + "$"));
}
我们使用 Pattern.quote 的原因是允许它处理正则表达式中具有特殊含义的字符,例如']'。
如果你不能使用正则表达式,状态机风格的方法会给你很好的结果:
public boolean succeeds (char a, char b, String s) {
int state = 0;
for (int n = 0; n < s.length(); ++ n) {
if (state == 0) {
if (s.charAt(n) == b)
state = 1;
} else if (state == 1) {
if (s.charAt(n) == a)
state = 0;
else
return false;
}
}
return (state == 0);
}
由于只有两种状态,您可以只使用布尔值。