簡體   English   中英

regexp檢查字符是否與字符串匹配

[英]regexp to check if characters match string

我有一些帶有字符和字符串列表的輸入字符串。 我需要的是僅選擇符合包含字符的模式的字符串。 例如:

input chars =“ ask”,應該接受“ ask”,“ sak”,“ kas” ...,但不應接受“ akk”,“ aas” ...

現在我使用“ ^ [s | a | k] [s | a | k] [s | a | k] $”之類的模式,但是有可能接受並重復字符(“ akk”),所以如果我使用如果preg_match有效,我需要進行一些額外的檢查。

更復雜的是,幾乎沒有相同的字符:輸入“ askk”應匹配“ akks”,但不能匹配“ kkks”或“ assk”。

我相信可以使用單個正則表達式進行此檢查,但是我對正則表達式的了解並不深。

(要獲取輸入並顯示我使用php的結果)

使用正則表達式實際上很難解決這類問題。 如果您具有前瞻性表達式,則可以執行此操作。 這是一個示例,其中(?=...)是一個超前表達式。

/^(?=.*a)(?=.*s)(?=.*k).{3}$/

這里,每個(?=.*a)表達式都與該字母匹配,在表達式中的任何位置,。{3}指定它必須為三個字符。

當您有重復的字符時,這變得很復雜,但是仍然可能。 aask

/^(?=.*a.*a)(?=.*s)(?=.*k).{4}$/

僅當字符串中的任意位置有兩個a ,第一個匹配。

您可以通過其他幾種方式執行此操作。 例如,您可以遍歷每個字符並計算每個字母的數目,將其存儲在數組中(為O(n)),也可以按字母順序對字符進行排序( aks )並按字符對字符串進行匹配(其中是O(無論您的排序算法是什么)。

為什么在這里使用正則表達式? 我沒有看到好處。 您可以做的是對輸入字符串進行排序(例如,“ sak”和“ ask”都將變成“ aks”),然后將排序后的字符串與參考字符串(在這種情況下為“ aks”)進行比較。 或者只是對引用字符串“ ask”使用相同的函數。 像這樣:

function str_sort($str) {
    $chars = str_split($str);
    sort($chars);
    return implode('', $chars);
}

$pattern = 'ask';
$input = 'sak';
$valid = str_sort($pattern) == str_sort($input);

echo "Pattern: $pattern;\n";
echo "Input  : $input\n";
echo "Valid  : " . ($valid ? 'yes' : 'no') . "\n";

這是“ askk”的解決方案:

^(?=.*a)(?=.*s)(?=(?:.*k){2})[ask]{4}$

這個想法是先行使用,以確保首先在字符串中存在每個字符的正確數量,然后使用字符串的其余部分,以確保僅使用所提供集合中的字符。

看到它在Rubular上運行。

暫無
暫無

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

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