我想使用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']]);
}
答案 0 :(得分:0)
(?ms)^10(?=(?:(?!^10).)*\d{10} 01)(?:(?!^10).)*
$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).)*
匹配