[英]How do I create a dynamic capturing group in regex?
我有一個像這樣的字符串:
$str ="
- group1
- group2
- group3
";
我也有這個正則表達式 :
/(\-\s\w+)\n(\-\s\w+)\n(\-\s\w+)/
如您所知,有三個捕獲組: $1
, $2
和$3
。 我手動創建了這些組。 我的意思是如果我將此附加到上面的字符串中:
- group4
- group5
然后,該正則表達式與它們不匹配。
好吧,我有一個恆定的模式: (\\-\\s\\w+)
,我想根據字符串中匹配項的數量創建一個單獨的捕獲組。 野兔是幾個例子:
范例1:
$str="
- group 1
";
我需要一個正則表達式來給我所有的字符串, $1
。
范例2:
$str="
- group 1
- group 2
";
我需要一個正則表達式來給我第一行字符串( - group 1
) $1
,第二行( - group 2
) $2
好的,正如您在上面的示例中看到的那樣,字符串是動態的,但它是根據恆定模式進行的……現在,我想知道如何根據字符串創建動態捕獲組?
使用m-修飾符(多行):可以使每行匹配。
嘗試使用以下正則表達式:
preg_match_all('/(\-\s\w+)/m', $str, $matches);
print_r($matches);
捕獲重復基團的可能性是眾所周知的限制 。
如果您知道最大重復模式,則可以將正則表達式設置為(即max = 5):
/(\-\s\w+)\n(\-\s\w+)?\n?(\-\s\w+)?\n?(\-\s\w+)?\n?(\-\s\w+)?\n?/
然后您會在1到5的組中找到1到5個匹配項。
基本上,您必須重復(\\-\\s\\w+)?\\n?
以獲得最大可能的重復模式數量。
否則,如果未定義最大可能數,那么除了構造動態模式外,我不知道其他方法,例如:
$regex = '(\-\s\w+)\n';
$regex = '/'.( str_repeat( $regex, preg_match_all( "/$regex/", $str, $matches ) ) ).'/';
上面的模式可以使用,但是我不知道您要完全替換的條件,因此它可能無法用於您的目的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.