我想验证(最好使用.matches())%in之前的部分,例如“ookd& sr34!abc * % * blabla.h”没有开始或结束例如'k'。但是,'k'必须允许在这些端点之间(从%开始,不包括)。
我不能使用结束锚,因为我不想要整个字符串的结尾。另外,我不想拆分字符串,我想在一个正则表达式中完成所有操作。
可能是某种前瞻性的?我被卡住了。
答案 0 :(得分:0)
试试这个正则表达式^k.*k%
。
matches("ookd&sr34!abc*%*blabla.h") -> false
matches("kokd&sr34!abc*k%*blabla.h") -> true
matches("kookd&sr34!abc*%*blabla.h") -> false
答案 1 :(得分:0)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestClass {
public static void main(String[] args) {
String myString = "ookd&sr34!abc*%*blabla.h";
Pattern p = Pattern.compile("^k.*k%");
Matcher m = p.matcher(myString);
while(m.find()){
System.out.println(m.group());
}
System.out.println(Pattern.matches("^k.*k%.*", myString));
System.out.println(myString.matches("^k.*k%.*"));
}
}
以前从未使用过匹配,但它似乎需要。*结尾,在%之后或者它将返回false - 大概是因为它评估整个字符串而不仅仅是像Matcher.find那样的一部分(方法。
答案 2 :(得分:0)
像
这样的东西str.matches("(?!k)[^%]*(?<!k)%.*")
如果你忽略了环绕声,它会匹配任何字符序列,直到第一个%,然后是%,然后是其他所有字符。开头的前瞻确保第一个字符(如果有的话)不是k,后面的外观确保第一个字符(如果有的话)之前的最后一个字符不是k。与天真[^k].*?[^k]%
不同,这允许在%。