簡體   English   中英

使用正則表達式從字符串中獲取變量

[英]Getting variables from string with regular expressions

我發瘋了,一個正則表達式。 我有一個像這樣的字符串:

%closed% closed (%closed_percent%\%), %open% open (%open_percent%\%)

我需要一個匹配以下內容的正則表達式:

%closed%
%closed_percent%
%open%
%open_percent%

但不是兩個\\%

目前,我使用:

\%([^\%]+)\%

這給了我:

%closed%
%closed_percent%
%), %
% open (%
...

有人可以幫我嗎?

簡單的方法:

%\w+%

符合項目: %foo%

允許(多個)反斜杠轉義:

(?<!\\)(?:\\.)*%(\w+)%

僅匹配以下bar\\%foo% \\\\%bar% \\\\\\%baz%

...這也允許在其中進行轉義:

(?<!\\)(?:\\.)*%((?:[^\\%\s]+|\\.)+)%

匹配: %foo\\%bar%

將第一個捕獲組的值與最后兩個表達式一起使用。

嘗試這個:

\%([^(\\\%)]+?)\%

火柴

%closed%
%closed_percent%
%open%
%open_percent%

為了我。

假設對百分比包裝的令牌(包括轉義字符)中的內容以及可以轉義哪些字符(因此也可以轉義反斜杠: \\\\%token%應該有效)沒有任何限制,
這是您可以用來跳過轉義字符的模式:

\\.|(%([^%\\]|\\.)+%)

這將捕獲百分比包裝的令牌,並將它們捕獲在第一組( $1 )中。 轉義的字符也將被匹配(跳過它們是一個很好的技巧),但是使用PHP可以很容易地獲得相關的標記:

preg_match_all('/\\\\.|(%([^%\\\\]|\\\\.)+%)/', $str, $matches, PREG_PATTERN_ORDER);
$matches = array_filter($matches[1]);

工作示例: http : //ideone.com/dziCB

嘗試:

~\%\w+\%~

因此,在選擇中僅允許使用AZ和_。

$str = "%closed% closed (%closed_percent%\%), %open% open (%open_percent%\%)";

preg_match_all("~\%\w+\%~", $str, $matches);

$matches現在包含:

Array
(
    [0] => Array
    (
        [0] => %closed%
        [1] => %closed_percent%
        [2] => %open%
        [3] => %open_percent%
    )
)

在反斜杠后面添加否定的lookbehind! 這樣, \\%就被忽略了。

(?<!\\)\%([^\%]+)(?<!\\)\%

火柴

%關閉%

%closed_percent%

%打開%

%open_percent%

暫無
暫無

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

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