如何在两个单词之间包含可选空格而不选择下一个单词?

时间:2018-12-21 15:51:21

标签: regex

我具有以下这些文件名,并使用以下正则表达式进行匹配:

文件名:

  1. 1234 12345678测试文档2018年12月20日.pdf
  2. 1234 12345678 TESTDOCUMENT 2018年12月20日.pdf

我用来匹配文件名的正则表达式是:

(\d+)\s(\d+)\s(\w+\s?\w+)

对于第一个文件,它可以工作,但是对于第二个文件,它与12月匹配,因为这也是两个带有空格的单词。

在两种情况下,如果TEST与DOCUMENT之间没有空格,则如何编写正则表达式以最多仅匹配“ 1234 12345678 TEST DOCUMENT”。

预期结果:

  1. 1234 12345678测试文档
  2. 1234 12345678 TESTDOCUMENT

不是第二个文件(1234 12345678 TESTDOCUMENT December)

4 个答案:

答案 0 :(得分:3)

鉴于您所说的

  

“ TEST DOCUMENT”之后,通常是1月-12月格式的一个月

您可以使用前瞻性来确保与月份不符:

(\d+)\s(\d+)\s(\w+\s?(?!Jan|Feb|Mar|...|Dec)\w+)
                     ^^^^^^^^^^^^^^^^^^^^^^^...

这将确保第二个单词不以月份名称开头。

答案 1 :(得分:2)

另一种选择是在末尾匹配“ datelike”格式并捕获捕获组中以前的内容:

(\d+)\s(\d+)\s(.*?)\s\d{1,2},\s\d{4}\.pdf$

Regex demo

@iBug指出,如果您只想匹配文字字符或空格,则可以将(.*?)替换为([\w ]+)

答案 2 :(得分:1)

只需确保始终将零件与日期匹配,例如:

(\d+)\s(\d+)\s(\w+\s?\w+)\s\w+\s\d+

就足够了。

答案 3 :(得分:0)

您可以从行的开头选择所有内容,后跟(lookahead (?=...))空格和月份名称。这是11月和12月:

^.*(?= December| November)

请注意月份名称的大小写(驼峰式,大写等)。此外,您是否已使用不同的语言对数据进行了本地化,月份名称...