从日期字符串中删除特定字符

时间:2017-11-21 17:37:45

标签: regex perl

我有一个字符串

function flagClothes (clothes, userPrice){
 return clothes.map(function(price) {
   if(userPrice < price) return 'flagged' // I dont know exactly do you mean with flagged so i just return text, you can return anything.

 })
};

我想以此格式提取时间戳

INSTALLDATE=Tue Nov 07 19:35:38 UTC 2017

即。删除时区。

正确的正则表达式是什么?

我可以删除Tue Nov 07 19:35:38 2017 ,但我不确定如何匹配INSTALLDATE并将其从匹配的字符串中删除。

我当前的正则表达式:

UTC

4 个答案:

答案 0 :(得分:3)

年份是一个有用的标记,因为它无法在其他地方显示

$string =~ s/INSTALLDATE=(.*?)\s\w+(\s[0-9]{4})/$1$2/;

.*?非贪婪地匹配到四位数模式之前的最后一个单词。

详细

  • ?之后的.*量词使其匹配,直到后续模式的第一次出现。没有?,它会尽可能地匹配,在

  • 之间填充所有内容
  • 下一个模式是:space-word(\w+) - space-4 digits([0-9]{4});时间戳结束

  • 它将整个模式替换为()中捕获的内容,首先是$1

  • 中的$2

答案 1 :(得分:1)

我更喜欢位置方法

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;

输出

Tue Nov 07 19:35:38 2017

答案 2 :(得分:0)

另一种方式

部分受@zdim启发,你可以这样做:

$string =~ s/^.*?=(.*?)UTC\s*(.*)$/\1\2/

这匹配到第一个=^.*?=)之前的所有内容,将=之后和UTC之前的所有内容保存到\1({{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;}'

那是:

Tue Nov 07 19:35:38 2017

答案 3 :(得分:0)

正则表达式必须包含2个捕获组:

  • <script> $(document).ready(function () { $('#menuKategori li a').click(function () { var gelenVeri = $('#menu').text(); $.ajax({ url: '/Home/_PartialKonular/', data: { veri: gelenVeri }, datatype: 'Json', type: 'Get' }) }) }) </script> =之间。
  • UTC和字符串结尾之间。

所以正则表达式可以如下:

UTC

捕获两个组的优雅方法是:

/=(.*) UTC (.*)$/

其中my @res = $txt =~ /=(.*) UTC (.*)$/; 是一个数组,捕获正则表达式中包含的所有组。

然后你可以,例如打印两个捕获组,用空格分隔:

res

所以整个脚本可以如下:

print "Result: $res[0] $res[1]\n";