正则表达式,匹配年份列为范围

时间:2020-07-03 23:29:21

标签: r regex perl

我有这样的年份列表:

forEach

我想创建一个正则表达式以使年份符合以下条件:

2018-

2001–2020

1999-

2005-

你能帮我吗?

我尝试过xxxx- matches xxxx yyyy-nnnn matches nnnn [[:digit:]]{4}$,但它们只能部分起作用。

3 个答案:

答案 0 :(得分:4)

要获得由-字符确定的“范围”中的最后一年,这是最简洁的方法

my $year = (split /-/, $range)[-1];

如果最后一个定界符之后没有任何内容,那么split返回的最后一个元素就是它之前的内容,因此它的返回列表中的最后一个元素(由索引-1获得)给定的第二年-如2001-2020-或唯一的一年,如其他示例所示。这不执行输入检查。

使用正则表达式,一种方法是查找字符串中的最后一个数字

my ($year) = $range =~ /([0-9]+)[^0-9]*$/;

如果您使用[0-9]{4},那么还有一点检查措施。

如果需要,可以改用POSIX character class [[:digit:]]及其否定[[:^digit:]](或\P{PosixDigit}),但是请注意,它们与Unicode“数字字符”的所有方式匹配”,就像\d\D在ascii [0-9]顶部所做的(几百)一样(除非使用/a修饰符)。

针对两者的完整测试程序

use warnings;
use strict;
use feature 'say';

my @ranges = qw(2018- 2001-2020 1999- 2005-);

foreach my $range (@ranges) { 
    my $year = (split /-/, $range)[-1];
    
    # Or, using regex
    # my ($year) = $range =~ /([0-9]+)[^0-9]*$/;
    
    say $year;
}

根据需要打印。

答案 1 :(得分:1)

我们可以捕获4位数字作为组,然后在字符串的末尾(-)后面加上$,并用捕获组的后向引用(\\1)代替< / p>

sub(".*(\\d{4})-?$", "\\1", str1)
#[1] "2018" "2020" "1999" "2005"

数据

str1 <- c("2018-", "2001-2020", "1999-", "2005-")

答案 2 :(得分:1)

您可以在"-"上拆分文本并获取最后一个数字。

x <- c("2018-", "2001-2020", "1999-", "2005-")
sapply(strsplit(str1, '-', fixed = TRUE), tail, 1)
#[1] "2018" "2020" "1999" "2005"