用于匹配年份之前的字符串的正则表达式

RegEx for matching a string before a year

我有包含年份数字的目录名称。我想将它们拆分为年份之前的变量:

输入:

Holidays.uS.2019.bla.bla
Holidays.ca.old.2017.bla.bla
Holidays.2015.bla.bla.bla
Holidays.1.2.3.4.at.old.1999.bla.bla.bla.bla

年份并不总是在同一个地方,但它总是有 4 位数字。

我总是需要到今年为止的一切。

对于输入:

Holidays.ca.old.2017.bla.bla

输出:

Holidays.ca.old

尝试

set name Holidays.ca.old.2017.bla.bla
set numbers [regexp -all -inline {[0-9]+} $name]

我的代码输出的是年份数字,有时还有其他错误数字。

This expression 可能会帮助您设计一个:

([\w\.]+)(\.[0-9]{4}.+)

图表

此图显示了它的工作原理:

代码:

set string "Holidays.1.2.3.4.at.old.1999.bla.bla.bla.bla"
set match [regsub {([\w\.]+)(\.[0-9]{4}.+)} $string "\1"]
puts $match

输出

Holidays.1.2.3.4.at.old

您可以使用正则表达式来匹配一个点后跟 4 个数字,然后不跟一个字符字符,然后匹配任何其他字符 0 次或更多次,并使用 regsub 删除匹配的文本,例如这个:

regsub {\.[0-9]{4}\y.*} $name ""

参见Tcl demo online

set name "Holidays.ca.old.2017.bla.bla"
set res [regsub {\.[0-9]{4}\y.*} $name ""]
puts $res
# => Holidays.ca.old

正则表达式详细信息

  • \. - 一个点
  • [0-9]{4} - 四位数
  • \y - 单词边界
  • .* - 尽可能多的任意 0 个或更多字符。

如果您想在 regex101.com 看到正则表达式的演示,您需要将 \y 替换为 \b,请参阅 this demo here

(\w|\.)+(?=\.\d{4})

细分:

  • (\w|\.)+ 一个或多个单词(包括数字)或文字句点。
  • (?=\.\d{4}) 后跟四位数字的字面句点的正向预测。

演示:https://regex101.com/r/vaofyC/6

谢谢你的帮助,真好

我在 tcl 中使用它,并且正在完善我的工作

set name_split [regsub {\.[0-9]{4}\y.*} $name ""]

bash脚本我还需要它,如何使用它?

这实际上行不通:(

name_split=$(echo $name | {\.[0-9]{4}\y.*}