簡體   English   中英

改進工作正則表達式以匹配多行

[英]Improving a working regex to match multiple lines

我正在嘗試從舊的 DOS 轉儲中匹配用戶,以便他們可以遷移到新的東西。 它們以%符號開頭並以]結尾。 有些在一條線上,有些在多條線上。

https://regex101.com/r/0h5ndW/1

我的正則表達式%([^\%]*)]有效,但是有沒有更好的方法來 select 每個用戶從%] (包括%] )所以我可以將它們通過preg_replace並稍后操作它們?

我對多線部分有點懷疑。

Expected Output

%user:100 [     type=admin,     added=10/12/1997,     last-login:10/20/1997,     total-logins:45,     status:1 ]
%user:111 [     type=user,     added=10/12/1997,     last-login:10/27/1997,     total-logins:145,     status:1 ]
%user:112 [ type=viewer, added=10/12/1997,     last-login:10/23/1997,     total-logins:6,     status:1 ]
%user:113 [ type=viewer, added=10/12/1997,  last-login:10/14/1997,  total-logins:2, status:1]
%user:114 [ type=viewer, added=10/12/1997,  last-login:10/14/1997,  total-logins:1, status:1]
%user:115 [ type=viewer, added=10/12/1997,  last-login:10/12/1997,  total-logins:1, status:1 ]

原始數據

%user:100 [
    type=admin,
    added=10/12/1997,
    last-login:10/20/1997,
    total-logins:45,
    status:1
]

%user:111 [
    type=user,
    added=10/12/1997,
    last-login:10/27/1997,
    total-logins:145,
    status:1
]

%user:112 [ type=viewer, added=10/12/1997,
    last-login:10/23/1997,
    total-logins:6,
    status:1
]

%user:113 [ type=viewer, added=10/12/1997,  last-login:10/14/1997,  total-logins:2, status:1]

%user:114 [ type=viewer, added=10/12/1997,  last-login:10/14/1997,  total-logins:1, 
status:1]

%user:115 [ type=viewer, added=10/12/1997,  last-login:10/12/1997,  total-logins:1, 
status:1
]

您可以使用此正則表達式進行搜索:

((?:^%|(?!\A)\G).*)\R(?=[^][]*])

並將其替換為:

$1

更新的 RegEx 演示

PHP 代碼:

$repl = preg_replace('/((?:^%|(?!\A)\G).*)\R(?=[^][]*])/m', '$1', $str);

正則表達式詳細信息:

  • ( : 開始捕獲組 #1
    • (?:^%|(?!\A)\G) :在行開頭匹配%或從前一個匹配的結尾重新開始匹配。 \G斷言 position 在前一個匹配的結尾或第一個匹配的字符串的開頭。
    • .* :匹配同一行中的所有內容
  • ) : 結束捕獲組 #1
  • \R : 匹配任何類型的換行符
  • (?=[^][]*]) :確保前面有一個] ,中間沒有匹配[]

另一種選擇是使用您嘗試使用否定字符 class 的模式的變體來匹配%並從開始[直到結束]

然后每場比賽刪除換行符。

^%[^][]*\[[^][]*]$

解釋

  • ^字符串開頭
  • %[^][]*匹配除[]以外的任何字符的%和 0+ 次
  • \[[^][]*]匹配從[直到結束]
  • $斷言字符串結束

正則表達式演示| Php 演示

例如

$result = preg_replace_callback("/^%[^][]*\[[^][]*]$/m", function($m) {
    return str_replace(PHP_EOL, "", $m[0]);
}, $data);

作為正則表達式的替代方法,這只是使用]拆分數據。 然后修剪每一行並用空格替換新行(使用PHP_EOL )......

$output = explode("]", $data);
array_pop($output);
array_walk($output, function(&$data) {
    $data = str_replace(PHP_EOL, " ", trim($data)."]");
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM