Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 从日期字符串中删除特定字符_Regex_Perl - Fatal编程技术网

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/;
*?
不贪婪地匹配四位数模式前的最后一个单词

细部

  • *
    之后的
    量词使其匹配,直到随后的模式首次出现。如果没有
    ,它将尽可能匹配,将两者之间的所有内容都整合起来

  • 下一个模式是:空格字(
    \w+
    )-space-4位(
    [0-9]{4}
    );时间戳结束

  • 它用
    ()
    s中捕获的内容替换整个模式,第一个在
    $1
    中,第二个在
    $2


年份是一个有用的标记,因为它不能显示在其他任何地方

$string =~ s/INSTALLDATE=(.*?)\s\w+(\s[0-9]{4})/$1$2/;
*?
不贪婪地匹配四位数模式前的最后一个单词

细部

  • *
    之后的
    量词使其匹配,直到随后的模式首次出现。如果没有
    ,它将尽可能匹配,将两者之间的所有内容都整合起来

  • 下一个模式是:空格字(
    \w+
    )-space-4位(
    [0-9]{4}
    );时间戳结束

  • 它用
    ()
    s中捕获的内容替换整个模式,第一个在
    $1
    中,第二个在
    $2

另一种方式 部分灵感来自@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)
}
另一种方式 部分灵感来自@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补充道,如果不好,请告诉我。谢谢你的解释。它起作用了!我现在不能提高投票率,因为名声不好。我不知道为什么有人