我想验证(最好使用 .matches())例如“ookd&sr34!abc* % *blabla.h”中的 % 之前的部分不以例如“k”开头或结尾。但是,必须允许在这些端点之间使用“k”(以 % 开头,不包括)。
我不能使用结束锚,因为我不想要整个字符串的结尾。另外,我不想拆分字符串,我想在一个正则表达式中完成所有操作。
可能是某种前瞻?我被困住了。
试试这个正则表达式^k.*k%
。
matches("ookd&sr34!abc*%*blabla.h") -> false
matches("kokd&sr34!abc*k%*blabla.h") -> true
matches("kookd&sr34!abc*%*blabla.h") -> false
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() 方法那样评估它的一部分。
就像是
str.matches("(?!k)[^%]*(?<!k)%.*")
如果您忽略环视,这将匹配任何字符序列,直到第一个 %,然后是 %,然后是其他所有字符。开头的前瞻确保第一个字符(如果有的话)不是 k,而后瞻确保第一个 % 之前的最后一个字符(如果有的话)不是 k。与天真不同,[^k].*?[^k]%
这允许在 % 之前有少于两个字符的情况。