【问题标题】:How to include optional space between two words without picking next word?如何在两个单词之间包含可选空格而不选择下一个单词?
【发布时间】:2018-12-21 15:51:20
【问题描述】:

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

文件名:

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

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

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

对于第一个文件,它正在工作,但对于第二个文件,它与十二月月份相匹配,因为这也是两个带有空格的单词。

在 TEST 和 DOCUMENT 之间有或没有空格的情况下,如何编写正则表达式以仅匹配“1234 12345678 TEST DOCUMENT”。

预期结果:

  1. 1234 12345678 测试文件
  2. 1234 12345678 测试文件

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

【问题讨论】:

  • 您希望如何区分这两种情况?它会一直说“测试文档”还是其他名称?
  • 可以是任何文本。可能的组合是带空格的两个单词
  • 那我看不出你怎么区分这两者。没有任何区别特征,除非您有固定列之类的其他东西。
  • TEST DOCUMENT 之后,总是一月-十二月格式的一个月
  • 好的。然后,您的正则表达式的一部分需要匹配所有十二个月的名称,例如this。这将为您提供结束分界线。

标签: regex


【解决方案1】:

如你所说

在 TEST DOCUMENT 之后,它始终是一月至十二月格式的一个月

您可以使用前瞻来确保您与月份不匹配:

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

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

【讨论】:

  • 感谢您的回答。它可以是月份之前的任何单词,但不仅是第二个单词。有什么办法可以匹配吗?
  • 这行得通。 (\d+)\s(\d+)\s(.+?(?=一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月)))
【解决方案2】:

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

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

Regex demo

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

【讨论】:

  • \w+ 优于 .*?
  • @iBug 这取决于内容之间的内容。在这种情况下,它可能是[\w ]+。将您的建议添加到我的回答中。
【解决方案3】:

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

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

足够了。

【讨论】:

    【解决方案4】:

    您可以选择从行首开始的所有内容,然后是(前瞻(?=...))一个空格和一个月的名称。这是 11 月和 12 月:

    ^.*(?= December| November)
    

    注意月份名称的大小写(驼峰、大写等)。另外,您是否有本地化数据、不同语言的月份名称...

    【讨论】:

      猜你喜欢
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多