验证子字符串中的端点没有拆分

时间:2012-11-18 20:59:56

标签: java regex

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

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

可能是某种前瞻性的?我被卡住了。

3 个答案:

答案 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]%不同,这允许在%。

之前少于两个字符的情况