0

我想验证(最好使用 .matches())例如“ookd&sr34!abc* % *blabla.h”中的 % 之前的部分不以例如“k”开头或结尾。但是,必须允许在这些端点之间使用“k”(以 % 开头,不包括)。

我不能使用结束锚,因为我不想要整个字符串的结尾。另外,我不想拆分字符串,我想在一个正则表达式中完成所有操作。

可能是某种前瞻?我被困住了。

4

3 回答 3

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
于 2012-11-18T21:06:32.810 回答
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() 方法那样评估它的一部分。

于 2012-11-18T21:11:33.437 回答
0

就像是

str.matches("(?!k)[^%]*(?<!k)%.*")

如果您忽略环视,这将匹配任何字符序列,直到第一个 %,然后是 %,然后是其他所有字符。开头的前瞻确保第一个字符(如果有的话)不是 k,而后瞻确保第一个 % 之前的最后一个字符(如果有的话)不是 k。与天真不同,[^k].*?[^k]%这允许在 % 之前有少于两个字符的情况。

于 2012-11-18T21:12:43.793 回答