簡體   English   中英

用於解析括號和括號之間的文本的正則表達式

[英]Regex for parsing text between brackets and parenthesis

我想創建一個正則表達式,將所有$text1$text2在兩個分離數組中。 text1和text2是:( ($text1)[$text2] ,存在於字符串中。

我寫了這段代碼來解析括號:

<?php

preg_match_all("/\[[^\]]*\]/", $text, $matches);

?>

它工作正常。

我寫了另一個代碼來解析parantheses:

<?php

preg_match('/\([^\)]*\)/', $text, $match);

?>

但它只是解析其中一個parantheses而不是字符串中的所有parantheses :(

所以我有兩個問題:

1)如何解析字符串中所有parantheses之間的文本?

2)如何按照我在頂部描述的那樣達到$text1$text2

請幫我。 我對正則表達式很困惑。 如果你有一個很好的資源共享鏈接。 謝謝 ;)

preg_match_all()與以下正則表達式一起使用:

/(\[.+?\])(\(.+?\))/i

演示

細節

/                   # begin pattern
    (               # first group, brackets
        \[          # literal bracket
            .+?     # any character, one or more times, greedily
        \]          # literal bracket, close
    )               # first group, close
    (               # second group, parentheses
        \(          # literal parentheses
            .+?     # any character, one or more times, greedily
        \)          # literal parentheses, close
    )               # second group, close
/i                  # end pattern

這將保存一個數組中括號之間的所有內容,以及另一個數組中括號之間的所有內容。 所以,在PHP中:

<?php
$s = "[test1](test2) testing the regex [test3](test4)";
preg_match_all("/(\[.+?\])(\(.+?\))/i", $s, $m);
var_dump($m[1]); // bracket group
var_dump($m[2]); // parentheses group

演示

您未能捕獲多個( )包裝的子字符串的唯一原因是因為您調用的是preg_match()而不是preg_match_all()

幾個小點:

  1. )的否定字符類的內部也沒必要進行轉義。
  2. 關閉方括號(在圖案的末尾)不需要轉義; 正則表達式不會誤認為它意味着字符類的結束。
  3. 無需聲明i模式修飾符,您的模式中沒有要修改的字母。

將您的兩種模式合二為一,烘烤我的小點,您就擁有了完全精致/優化的模式。

如果您不知道為什么您的模式很棒,我會解釋。 你看,當你要求正則表達式引擎匹配“貪婪”時,它可以更有效地移動(減少步驟)。

通過使用否定的字符類,您可以使用貪婪匹配。 如果你只使用. 那么你必須使用“懶惰”匹配( *? )來確保匹配不會“走得太遠”。

模式: ~\\(([^)]*)\\)\\[([^\\]]*)]~ (11步)

以上將捕獲括號中的零個或多個字符作為捕獲組#1,並將方括號之間的零個或多個字符捕獲為捕獲組#2。

如果您知道您的目標字符串將遵循您的嚴格格式,您甚至可以從模式中刪除最終]以提高效率。 (10個步驟)

比較這與懶惰. 匹配。 ~\\((.*?)\\)\\[(.*?)]~ (35步)這只是你的小16字符輸入字符串。 隨着文本長度的增加(我只能想象您將這些子字符串定位在更大的文本塊中),性能影響會變得更大。

我的觀點是,總是嘗試設計使用“貪婪”量詞的模式,以追求最佳/最有效的模式。 (關於提高效率的進一步提示:避免使用管道( | ),避免捕獲組,並在合理的情況下避免使用外觀,因為它們需要花費步驟。)

代碼:( 演示

$string='Demo #1: (11 steps)[1] and Demo #2: (35 steps)[2]';

var_export(preg_match_all('~\(([^)]*)\)\[([^\]]*)]~',$string,$out)?array_slice($out,1):[]);

輸出:(我用array_slice()修剪了全字符串匹配)

array (
  0 => 
  array (
    0 => '11 steps',
    1 => '35 steps',
  ),
  1 => 
  array (
    0 => '1',
    1 => '2',
  ),
)

或者根據您的使用情況:(使用PREG_SET_ORDER

代碼:( 演示

$string='Demo #1: (11 steps)[1] and Demo #2: (35 steps)[2]';

var_export(preg_match_all('~\(([^)]*)\)\[([^\]]*)]~',$string,$out,PREG_SET_ORDER)?$out:[]);

輸出:

array (
  0 => 
  array (
    0 => '(11 steps)[1]',
    1 => '11 steps',
    2 => '1',
  ),
  1 => 
  array (
    0 => '(35 steps)[2]',
    1 => '35 steps',
    2 => '2',
  ),
)

暫無
暫無

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

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