仅当子字符串不存在时,正则表达式才匹配字符串

时间:2015-10-08 15:22:48

标签: java regex

str = "sysparm_type=list_data&count=20&start=0&p=incident%3Bq%3Aactive%3Dtrue%5Epriority%3D1%5EEQ&table=incident"

我已经为上面的字符串编写了一个正则表达式但我想只在不存在“priority”子字符串的情况下匹配它。这是我的正则表达式:

.*sysparm_type=list_data&count=(\d+)&start=(\d+)&p=incident.*active.*true^((?!priority).)*$&table=incident

但是正则表达式的这部分^((?!priority)。)* $无效。

3 个答案:

答案 0 :(得分:1)

(a)regexp是查询字符串解析的错误解决方案 - 缓慢,内存消耗,容易出错

(b)尝试将任何现有的库用于此任务,例如apache commons

select 
  a.DEPT
 ,a.DIV
 ,a.PART
 ,convert(datetime,convert(varchar(2),datepart("mm",a.Release_Date))+'/1/'+ convert(varchar(4),datepart("yyyy",a.Release_Date)),101) as rptng_mnth
from
  @tmpReportData3 a
  left join @tmpReportData4 b on b.dept = a.dept and a.div = b.div and a.part = b.part
where b.dept is null
order by
  a.rptng_mnth

答案 1 :(得分:1)

Caret ^和$匹配整个字符串的开头和结尾。很贪心。

如果您只检查配置文件字符串是否存在,它会更简单,更容易阅读和维护吗?

    String pattern = "((?!priority).)*";  <== pasted from above, prob not valid regex

  // Create a Pattern object
  Pattern r = Pattern.compile(pattern);

  // Now create matcher object.
  Matcher m = r.matcher(line);
  if (m.find( )) {
    System.out.println("Found value" );

  } else {
     System.out.println("NO MATCH");
  }

答案 2 :(得分:0)

如果您想检查subString,我们会检查一个简单的解决方案str.indexOf(subString)如果int大于0,则返回str subString }包含.*priority.*

如果你想在regExp中使用模式substring,如果你确定它的出现和位置,你可以对applicationSignificantTimeChange:进行更多的限制