Regex 从日期字符串中删除特定字符
我有一根绳子Regex 从日期字符串中删除特定字符,regex,perl,Regex,Perl,我有一根绳子 INSTALLDATE=Tue Nov 07 19:35:38 UTC 2017 我想从中提取这种格式的时间戳 Tue Nov 07 19:35:38 2017 i、 移除时区后 它的正确正则表达式是什么 我可以删除INSTALLDATE,但我不确定如何匹配UTC,并将其从匹配的字符串中删除 我现在的正则表达式: ($string) = ($string =~ /INSTALLDATE=(.*)/); 年份是一个有用的标记,因为它不能显示在其他任何地方 $string =~
INSTALLDATE=Tue Nov 07 19:35:38 UTC 2017
我想从中提取这种格式的时间戳
Tue Nov 07 19:35:38 2017
i、 移除时区后
它的正确正则表达式是什么
我可以删除INSTALLDATE
,但我不确定如何匹配UTC
,并将其从匹配的字符串中删除
我现在的正则表达式:
($string) = ($string =~ /INSTALLDATE=(.*)/);
年份是一个有用的标记,因为它不能显示在其他任何地方
$string =~ s/INSTALLDATE=(.*?)\s\w+(\s[0-9]{4})/$1$2/;
*?
不贪婪地匹配四位数模式前的最后一个单词
细部
之后的*
量词使其匹配,直到随后的模式首次出现。如果没有?
,它将尽可能匹配,将两者之间的所有内容都整合起来?
- 下一个模式是:空格字(
)-space-4位(\w+
);时间戳结束[0-9]{4}
- 它用
s中捕获的内容替换整个模式,第一个在()
中,第二个在$1
$2
$string =~ s/INSTALLDATE=(.*?)\s\w+(\s[0-9]{4})/$1$2/;
*?
不贪婪地匹配四位数模式前的最后一个单词
细部
之后的*
量词使其匹配,直到随后的模式首次出现。如果没有?
,它将尽可能匹配,将两者之间的所有内容都整合起来?
- 下一个模式是:空格字(
)-space-4位(\w+
);时间戳结束[0-9]{4}
- 它用
s中捕获的内容替换整个模式,第一个在()
中,第二个在$1
$2
$string =~ s/^.*?=(.*?)UTC\s*(.*)$/\1\2/
这将匹配第一个=
(^.*?=
)之前的所有内容,将=
之后和UTC
之前的所有内容保存到\1
((.*)
),跳过UTC
和任何后续空白(UTC\s*
),并将行的其余部分保存到\2
(((.*)
)。然后用\1\2
替换字符串,即第一个和第二个保存的部分粘在一起。结果是,从开始到第一个=
的所有内容都消失了,紧跟其后的UTC
任何空格也消失了。例如:
$ echo "INSTALLDATE=Tue Nov 07 19:35:38 UTC 2017" |
perl -ne 's/^.*?=(.*?)UTC\s*(.*)$/\1\2/; print;'
Tue Nov 07 19:35:38 2017
原始答案
我只知道这有两个步骤,虽然可能有一个班轮。我用过:
echo "INSTALLDATE=Tue Nov 07 19:35:38 UTC 2017" |
perl -ne 'if(/=(.*)$/) { my $rest = $1; $rest =~ s/UTC\s+//; print $rest;}'
2017年11月7日星期二19:35:38
即:
if(/=(.*)$/) { # Grab everything after the = into $1
my $rest = $1; # copy $1 to writeable variable $rest
$rest =~ s/UTC\s+//; # Remove "UTC" and any following whitespace from $rest
print $rest; # Output to the console (you could do something else instead)
}
另一种方式
部分灵感来自@zdim,您可以:
$string =~ s/^.*?=(.*?)UTC\s*(.*)$/\1\2/
这将匹配第一个=
(^.*?=
)之前的所有内容,将=
之后和UTC
之前的所有内容保存到\1
((.*)
),跳过UTC
和任何后续空白(UTC\s*
),并将行的其余部分保存到\2
(((.*)
)。然后用\1\2
替换字符串,即第一个和第二个保存的部分粘在一起。结果是,从开始到第一个=
的所有内容都消失了,紧跟其后的UTC
任何空格也消失了。例如:
$ echo "INSTALLDATE=Tue Nov 07 19:35:38 UTC 2017" |
perl -ne 's/^.*?=(.*?)UTC\s*(.*)$/\1\2/; print;'
Tue Nov 07 19:35:38 2017
原始答案
我只知道这有两个步骤,虽然可能有一个班轮。我用过:
echo "INSTALLDATE=Tue Nov 07 19:35:38 UTC 2017" |
perl -ne 'if(/=(.*)$/) { my $rest = $1; $rest =~ s/UTC\s+//; print $rest;}'
2017年11月7日星期二19:35:38
即:
if(/=(.*)$/) { # Grab everything after the = into $1
my $rest = $1; # copy $1 to writeable variable $rest
$rest =~ s/UTC\s+//; # Remove "UTC" and any following whitespace from $rest
print $rest; # Output to the console (you could do something else instead)
}
我更喜欢位置法
use strict;
use warnings 'all';
use feature 'say';
my $s = 'INSTALLDATE=Tue Nov 07 19:35:38 UTC 2017';
my $date = join ' ', ( $s =~ /[\w:]+/g )[1,2,3,4,6];
say $date;
输出
我更喜欢位置法
use strict;
use warnings 'all';
use feature 'say';
my $s = 'INSTALLDATE=Tue Nov 07 19:35:38 UTC 2017';
my $date = join ' ', ( $s =~ /[\w:]+/g )[1,2,3,4,6];
say $date;
输出
正则表达式必须包含2个捕获组:
- 在
=
和UTC
之间
- 在
UTC
和字符串末尾之间
因此正则表达式可以如下所示:
/=(.*) UTC (.*)$/
my $txt = "INSTALLDATE=Tue Nov 07 19:35:38 UTC 2017";
print "Source: $txt\n";
my @res = $txt =~ /=(.*) UTC (.*)$/;
print "Result: $res[0] $res[1]\n";
捕获这两个组的优雅方法是:
my @res = $txt =~ /=(.*) UTC (.*)$/;
其中,res
是捕获正则表达式中包含的所有组的数组
然后,您可以打印两个捕获组,并用空格分隔:
print "Result: $res[0] $res[1]\n";
因此,整个脚本可以如下所示:
/=(.*) UTC (.*)$/
my $txt = "INSTALLDATE=Tue Nov 07 19:35:38 UTC 2017";
print "Source: $txt\n";
my @res = $txt =~ /=(.*) UTC (.*)$/;
print "Result: $res[0] $res[1]\n";
正则表达式必须包含2个捕获组:
- 在
=
和UTC
之间
- 在
UTC
和字符串末尾之间
因此正则表达式可以如下所示:
/=(.*) UTC (.*)$/
my $txt = "INSTALLDATE=Tue Nov 07 19:35:38 UTC 2017";
print "Source: $txt\n";
my @res = $txt =~ /=(.*) UTC (.*)$/;
print "Result: $res[0] $res[1]\n";
捕获这两个组的优雅方法是:
my @res = $txt =~ /=(.*) UTC (.*)$/;
其中,res
是捕获正则表达式中包含的所有组的数组
然后,您可以打印两个捕获组,并用空格分隔:
print "Result: $res[0] $res[1]\n";
因此,整个脚本可以如下所示:
/=(.*) UTC (.*)$/
my $txt = "INSTALLDATE=Tue Nov 07 19:35:38 UTC 2017";
print "Source: $txt\n";
my @res = $txt =~ /=(.*) UTC (.*)$/;
print "Result: $res[0] $res[1]\n";
欢迎来到这个网站!查看和,了解有关提问的更多信息,这些问题将吸引高质量的答案。您可以选择包含更多信息。到目前为止你试过什么?您使用哪个正则表达式获取INSTALLDATE
部分?谢谢请显示您拥有的代码始终是UTC,还是需要处理非UTC时区?谢谢您的帮助。这是我当前的正则表达式:($string)=($string=~/INSTALLDATE=(.*)/;我不知道如何从中删除UTC。这是肯定的,始终是UTC。欢迎访问该网站!查看和,了解有关提问的更多信息,这些问题将吸引高质量的答案。您可以选择包含更多信息。到目前为止你试过什么?您使用哪个正则表达式获取INSTALLDATE
部分?谢谢请显示您拥有的代码始终是UTC,还是需要处理非UTC时区?谢谢您的帮助。这是我当前的正则表达式:($string)=($string=~/INSTALLDATE=(.*)/;我不知道如何从中删除UTC。它总是UTC,这是肯定的。你能解释一下正则表达式吗?@PushpinderSingh补充道,如果不好,请告诉我。谢谢你的解释。它起作用了!“我现在不能提高投票率,因为声望很低。你能解释一下正则表达式吗?”PushpinderSingh补充道,如果不好,请告诉我。谢谢你的解释。它起作用了!我现在不能提高投票率,因为名声不好。我不知道为什么有人