我有这样的年份列表:
forEach
我想创建一个正则表达式以使年份符合以下条件:
2018-
2001–2020
1999-
2005-
你能帮我吗?
我尝试过xxxx- matches xxxx
yyyy-nnnn matches nnnn
或[[:digit:]]{4}$
,但它们只能部分起作用。
答案 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"