正则表达式替换部分字符串

时间:2019-08-20 16:55:01

标签: regex powershell

我正在尝试替换一系列字符串以提取日期。我使用的是Powershell,并提供了部分示例以供参考:

$Strings = @("this_is_a_test_8_20_2019_test", "this_is_a_test_8_19_2019_test")
$Strings -replace "[^0-9_]",""

留下结果:

  

____ 8_20_2019 _

     

____ 8_19_2019 _

我试图仅隔离不跟在另一个_后面的_字符,然后隔离数字。我感觉好像缺少了非常明显的东西,但是我不确定。任何人有任何想法/建议吗?

3 个答案:

答案 0 :(得分:1)

假设您期望:

8_20_2019
8_19_2019

那么您需要:

$Strings -replace "[^\d]+_|_[^\d]+",""

答案 1 :(得分:1)

一个选项可能是匹配1+倍而不是数字\D+,并使用正向查找(?=断言直接在右边的是下划线或字符串{{1 }}

在替换中,使用一个空字符串。

$

Regex demo | Try it online

\D+(?:_|$)

结果

$Strings = @("this_is_a_test_8_20_2019_test", this_is_a_test_8_19_2019_test")
$Strings -replace "\D+(?:_|$)",""

答案 2 :(得分:0)

假设您说的是要说的日期(而不只是数字字符串)时是要说的,那么这个otta就可以完成工作。 [咧嘴]

它做什么...

  • 不使用任何内容替换非日期字符串部分
  • 使用::ParseExact()将日期 string 转换为日期时间 object
    由于某种原因,日期模式会将两个输入数字与一个模式数字匹配,但不会将一个输入数字与两个模式数字匹配。

代码...

$InStuff = @(
    "this_is_a_test_8_20_2019_test"
    "this_is_a_test_10_9_2001_test"
    'test_with_two_digits_12_12_2012_gobbledegook'
    'single_digit_test_1_2_1999_arglebargle'
    )

foreach ($IS_Item in $InStuff)
    {
    $DateString = $IS_Item -replace '^.+_(\d{1,2}_\d{1,2}_\d{4})_.+$', '$1'
    [datetime]::ParseExact($DateString, 'M_d_yyyy', $Null)
    }

输出...

2019 August 20, Tuesday 12:00:00 AM
2001 October 09, Tuesday 12:00:00 AM
2012 December 12, Wednesday 12:00:00 AM
1999 January 02, Saturday 12:00:00 AM