我有一个这样的年份清单:
2018-
2001–2020
1999-
2005-
我想创建一个正则表达式来匹配这些条件的年份:
xxxx- matches xxxx
yyyy-nnnn matches nnnn
你能帮我么?
我试过了[[:digit:]]{4}$,或者[[:digit:]]{4}-$,但他们只是部分工作。
-为了让最后一年进入由性格确定的“范围” ,最干净的方式
my $year = (split /-/, $range)[-1];
如果在最后一个分隔符之后没有任何内容,那么最后一个返回的元素 bysplit就是它之前的元素,所以它的返回列表中的最后一个元素(用 index 获得-1)要么是第二个给定的年份——2001-2020如一,与其他示例一样。这不执行输入检查。
使用正则表达式,一种方法是查找字符串中的最后一个数字
my ($year) = $range =~ /([0-9]+)[^0-9]*$/;
如果您使用,[0-9]{4}那么还有一个小的额外检查措施。
如果需要,可以使用POSIX字符类 [[:digit:]]及其否定[[:^digit:]](或\P{PosixDigit}),但请注意,这些匹配所有方式的 Unicode“数字字符”,就像ascii 顶部的\d和\Ddo(几百个)一样[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;
}
根据需要打印。
您可以拆分文本"-"并获取最后一个数字。
x <- c("2018-", "2001-2020", "1999-", "2005-")
sapply(strsplit(str1, '-', fixed = TRUE), tail, 1)
#[1] "2018" "2020" "1999" "2005"
-我们可以将 4 位数字捕获为组,然后在字符串的末尾 ( )后跟 a$并替换\\1为捕获组的反向引用 ( )
sub(".*(\\d{4})-?$", "\\1", str1)
#[1] "2018" "2020" "1999" "2005"
str1 <- c("2018-", "2001-2020", "1999-", "2005-")