簡體   English   中英

如何在正則表達式中創建動態捕獲組?

[英]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.

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