我试图在不包含特定子字符串的字符串列表中过滤掉那些字符串(在我的情况下,这只是今天的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
答案 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.*";