如何使用正则表达式在Java中查找不包含特定字符串的字符串

时间:2018-02-14 16:24:43

标签: java regex

我试图在不包含特定子字符串的字符串列表中过滤掉那些字符串(在我的情况下,这只是今天的YYYY-MM-DD格式的日期)但是无法这样做。

这是我到目前为止所尝试过的。

My String采用以下格式 - ABC-TEST.20181206.20181208- 20180215 .log

该字符串也可以采用这种格式 - ABC-TEST.20181206.20181208- 20180215 -1.log(.log之前的1可能会达到无限)

如果我看到字符串以今天结束的日期结束(在.log或-.log之前),我需要找到它。

所以,由于它没有以今天的日期结束,我需要过滤掉它。

我已尝试使用此模式来识别包含今天日期的文件,但我无法找到不包含该文件的字符串

(.*?)-20180221-?(\\d+)?.log

这是我没有运气的模式之一

(.*?)-^((?!20180221))-?(\\d+)?.log

2 个答案:

答案 0 :(得分:1)

如果你愿意接受一些合理的数字限制,那么你可以使用一个基本的负面观察,如下所示:

String pattern = ".*(?<!20180215(-[0-9]{1,7})?\\.log)$";
String false1 = "ABC-TEST.20181206.20181208-20180215.log";
String false2 = "ABC-TEST.20181206.20181208-20180215-1.log";
String true1 = "ABC-TEST.20181206.20181208-20180216.log";
String true2 = "ABC-TEST.20181206.20181208-20180216-1.log";

System.out.println(false1.matches(pattern)); // false
System.out.println(false2.matches(pattern)); // false
System.out.println(true1.matches(pattern)); // true
System.out.println(true2.matches(pattern)); // true

我想指出,如果允许尾随计数器超过7位,那么它会根据您概述的算法创建一个模糊的情况,因为此时无法区分计数器20180215和日期20180215。

问题进化#1

问题作者使用了这个答案的评论部分来改变他的要求如下:

  

字符串应包含&#34; TEST&#34;

<强>答案

您只需在此答案中将.*TEST添加到模式的前面。像这样:

String pattern = ".*TEST.*(?<!20180215(-[0-9]{1,7})?\\.log)$";

问题进化#2

问题作者使用了这个答案的评论部分来改变他的要求如下:

  

选择不包含TEST且不包含今天日期

的字符串

<强>答案

你可以使用&#34; TEST&#34;的否定前瞻对于每个重复的初始通配符,如下所示:

String pattern = "((?!TEST).)*(?<!20180215(-[0-9]{1,7})?\\.log)";

答案 1 :(得分:0)

嗯,在我的时区,它仍然是2月14日,所以我使用了:

egrep -- "-$(date "+%Y%m%d" -d now+1day )-?.log" sample
My String is in this format - ABC-TEST.20181206.20181208-20180215.log

嗯 - 您正在使用Java?为什么不呢?

-> import java.util.Date
-> Date d = new Date()
-> String today = String.format ("%tY%tm%td", d, d, d)
-> String s1 = "My String is in this format - ABC-TEST.20181206.20181208-20180214.log"
-> String s2 = "The string may also be in this format - ABC-TEST.20181206.20181208-20180214-1.log (the 1 before .log may go on up to infinite)"
-> String pattern = ".*" + today + "\\.log"
-> s1.matches (pattern) 
|  Expression value is: true
|    assigned to temporary variable $39 of type boolean
-> s2.matches (pattern) 
|  Expression value is: false
|    assigned to temporary variable $40 of type boolean

这是从jshell复制的,这是一个很好的工具,用于快速临时测试。

 (.*?)-20180221-?(\\d+)?.log

与今天相比 - 无论是14日还是15日 - 我们都不想严格要求,但02/21相当不错,不是吗?

第一个问号应该是什么?

细线可以

   -20180221.log
   -20180221-.log
   -20180221888.log
   -20180221-888.log

? 如果行不匹配 - 您是否仍需要找到包含

的行

或者不是

   -20180221.log  

或        -20180221-888.log

然后:

   String pattern = ".*" + today + "(-[0-9]+)?\\.log";

如果日志背后可能有某些内容:

   String pattern = ".*" + today + "(-[0-9]+)?\\.log.*";