0

我有一个这样的年份清单:

2018-

2001–2020

1999-

2005-

我想创建一个正则表达式来匹配这些条件的年份:

xxxx-     matches xxxx

yyyy-nnnn matches nnnn

你能帮我么?

我试过了[[:digit:]]{4}$,或者[[:digit:]]{4}-$,但他们只是部分工作。

4

3 回答 3

3

-为了让最后一年进入由性格确定的“范围” ,最干净的方式

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;
}

根据需要打印。

于 2020-07-04T00:52:01.743 回答
0

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

x <- c("2018-", "2001-2020", "1999-", "2005-")
sapply(strsplit(str1, '-', fixed = TRUE), tail, 1)
#[1] "2018" "2020" "1999" "2005"
于 2020-07-04T01:27:45.643 回答
0

-我们可以将 4 位数字捕获为组,然后在字符串的末尾 ( )后跟 a$并替换\\1为捕获组的反向引用 ( )

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

数据

str1 <- c("2018-", "2001-2020", "1999-", "2005-")
于 2020-07-03T23:31:59.580 回答