RegEx用于在一年之前匹配字符串

时间:2019-05-04 20:43:46

标签: regex string bash tcl

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

输入:

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]

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

4 个答案:

答案 0 :(得分:2)

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

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

enter image description here

此图显示其工作方式:

enter image description here

代码:

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

答案 1 :(得分:1)

您可以使用正则表达式来匹配一个点后跟一个不跟单词char的4位数字,然后匹配0次或更多次其他char,并使用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

答案 2 :(得分:0)

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

故障

  • (\w|\.)+一个或多个单词(包括数字)或立即数。
  • (?=\.\d{4})在字面量期间正向超前,后面紧跟四位数。

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

答案 3 :(得分:0)

谢谢您的帮助,真的很好

我在tcl中使用了它,并在性能上有所作为

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

bash脚本仍需要它,怎么使用?

这实际上不起作用:(

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