鑒于這個干草堆和Regex PCRE2(PHP>=7.3):
#1 #2 #3
green [foo] [foo1]
red [foo]
blue [foo] [foo1] [foo2]
yellow [foo2]
green [foo]
green [foo] [foo1]
red [foo]
pink [foo3]
在哪里:
#1 始終是一個可以包含數字但不能包含空格的字串。
#2#1和之間總是隨機的空間量3。
#3與#1括號內相同,[ ]并且可以存在多個括號。
我正在嘗試洗掉所有包含欺騙的行,#1但保留找到的最后一個欺騙行。
它看起來像:
blue [foo] [foo1] [foo2]
yellow [foo2]
green [foo] [foo1]
red [foo]
pink [foo3]
清除所有包含相同字串的行,#1只保留最后一行。
以及不包含欺騙的行,#1例如:
pink [foo3] 留著它們。
我試圖盡可能詳細地解釋它,如果它仍然不清楚或者使用正則運算式不可能,請告訴我。
uj5u.com熱心網友回復:
您可以將以下正則運算式(帶有標志g,m和i)的匹配項轉換為空字串:
^([a-z\d]).*\n(?![\s\S]*\b^\1\b)
該標志g防止在第一次匹配后回傳,m( multiline ) 導致^和$匹配行的開頭和結尾而不是字串的開頭和結尾,i并使匹配不區分大小寫。
演示
運算式的元素如下:
^ # match beginning of line
([a-z\d]) # match one or more letters or digits and save to capture group 1
.* # match zero or more characters other than newlines
\n # match linefeed
(?! # begin negative lookahead
[\s\S]* # match zero or more characters including line terminators
\b^\1\b # match content of group 1 with word breaks before and after
) # end negative lookahead
注意.匹配回車\r。如果最后一行可能不是以換行符結尾,請更改\n為(?:\n|$).
如果您希望識別任何不具備所需格式的字串,您可以使用以下正則運算式來匹配格式不正確的行:
^(?![a-z\d]*(?: *\[[^[\]\r\n]*\]) \r?\n).*
演示
將游標懸停在鏈接處運算式的每個元素上,以獲得對該元素功能的解釋。
uj5u.com熱心網友回復:
你可以用
^(\S )\h \[\S*\](?!\S).*$(?![\s\S]*^\1)
^字串的開始(\S )捕獲組 1\h匹配 1 個空格\[\S*\](?!\S)從開始[到結束匹配,]并在右側斷言空白邊界以不匹配[foo]a.*$匹配該行的其余部分(?![\s\S]*^\1)負前瞻,斷言捕獲組 1 不再出現在文本中
查看正則運算式演示| PHP 演示。
例如
$re = '/^(\S )\h \[\S*\](?!\S).*$(?![\s\S]*^\1)/m';
$str = 'green [foo] [foo1]
red [foo]
blue [foo] [foo1] [foo2]
yellow [foo2]
green [foo]
green [foo] [foo1]
red [foo]
pink [foo3]';
preg_match_all($re, $str, $matches);
print_r($matches[0]);
輸出
Array
(
[0] => blue [foo] [foo1] [foo2]
[1] => yellow [foo2]
[2] => green [foo] [foo1]
[3] => red [foo]
[4] => pink [foo3]
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/351508.html
標籤:正则表达式
上一篇:整合RegEx來決議系統日志資料
