用于匹配年份之前的字符串的正则表达式
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 ""
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})
后跟四位数字的字面句点的正向预测。
谢谢你的帮助,真好
我在 tcl 中使用它,并且正在完善我的工作
set name_split [regsub {\.[0-9]{4}\y.*} $name ""]
bash脚本我还需要它,如何使用它?
这实际上行不通:(
name_split=$(echo $name | {\.[0-9]{4}\y.*}
我有包含年份数字的目录名称。我想将它们拆分为年份之前的变量:
输入:
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 ""
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})
后跟四位数字的字面句点的正向预测。
谢谢你的帮助,真好
我在 tcl 中使用它,并且正在完善我的工作
set name_split [regsub {\.[0-9]{4}\y.*} $name ""]
bash脚本我还需要它,如何使用它?
这实际上行不通:(
name_split=$(echo $name | {\.[0-9]{4}\y.*}