如何在动态值匹配之前和之后提取字符串,使用' Powershell'和' RegEx'

时间:2018-01-03 14:28:35

标签: regex powershell

我想使用PowerShell和regex提取文本文件的一部分。 该文件建立在从" 10"开始的值上。然后继续" 50"。所有值都是静态的,除了" 50" (可以连续多次出现) 到目前为止我得到了这个:

10
20
21
22   Value
23   Value
24   Value
25
26
27
28
29
30
31
32 
33
34
35
36
37
40   1111111111 01      
50   Value                                                                                                                                             
50   Value 
50   Value                                                                                                                                             
50   Value 
50   Value                                                                                                                                             
50   Value 
50   Value 
50   Value                                                                                                                                             
50   Value 
10
20
21
22   Value
23   Value
24   Value
25
26
27
28
29
30
31
32 
33
34
35
36
37
40   1111111112 01      
50   Value                                                                                                                                             
50   Value 
50   Value                                                                                                                                             
50   Value 
50   Value                                                                                                                                             
50   Value 

这匹配我的值并提取前19行文本,到目前为止一切顺利。然后我需要提取进行比赛的线,直到下一个" 10"。 我知道' -context 19,0'不会提取任何进行比赛的线路。这就是我遇到困难之前的事情。任何帮助表示赞赏。以下是该文件的示例:

    10
    20
    21
    22   Value
    23   Value
    24   Value
    25
    26
    27
    28
    29
    30
    31
    32 
    33
    34
    35
    36
    37
    40   1111111111 01      
    50   Value                                                                                                                                             
    50   Value 
    50   Value                                                                                                                                             
    50   Value 
    50   Value                                                                                                                                             
    50   Value 
    50   Value 
    50   Value                                                                                                                                             
    50   Value 

我想要的输出是:

$data = $request->input('items');

foreach($data as $key => $value) {
    InvoiceItem::create(['item_name' => $value['item_name']]);
}

1 个答案:

答案 0 :(得分:0)

代码

See regex in use here

(?ms)^10(?=(?:(?!^10).)*\d{10} 01)(?:(?!^10).)*

用法

See code in use here

$regex = '(?ms)^10(?=(?:(?!^10).)*\d{10} 01)(?:(?!^10).)*'
$str = # Your input here

[regex]::Matches($str, $regex) | foreach-object {$_.Value}

说明

  • (?ms)启用了标记m(多行 - 允许^$锚点匹配每一行)和s(dotall - 允许{{1匹配换行符.
  • \n在行首处断言位置
  • ^按字面意思匹配
  • 10确定后续匹配的正向前瞻
    • (?=(?:(?!^10).)*\d{10} 01)与除(?:(?!^10).)*匹配
    • 之外的任何字符匹配的贪婪令牌
    • ^10匹配任意数字10次
    • \d{10}匹配文字空格字符
    • 按字面意思匹配
  • 01与除(?:(?!^10).)*匹配
  • 之外的任何字符匹配的贪婪令牌