2010-08-06 52 views
0

我有一個正則表達式,其中包括一個命令列表。但是我不知道它背後的參數是什麼,所以它可以是一個字符串或一個數字或者什麼也不是。
可能有這種可能性,我不知道命令。正確的分組與正則表達式

在我的第一個版本中沒有任何字符串,所以(abc|def|[a-z]+)([0-9]*)工作正常。但是現在我也想允許字符串。 (abc|def|[a-z]+)([0-9]*|[a-z]*)不起作用。

字符串1:abc20def20ghi20
字符串2:abcdddef20ghi20
字符串3:abcdddef2d0ghi20abcdd

字符串1:
實施例與正則表達式1:abc20 *** *** def20 ghi20
與正則表達式實施例2:abc20 *** *** def20 ghi20

字符串2:
實施例與雷傑X 1:ABC *** *** dddef20 ghi20
例如用正則表達式2:ABC *** *** dddef20 ghi20

我希望得到以下結果:abc20 *** def20 * ** ghi20 and abcdd *** def20 *** ghi20

感謝您的幫助。

+1

斜體和粗體文本的含義是什麼? – Gumbo 2010-08-06 09:02:25

+0

這是不可能的。由於「命令」和「參數」都是由字母組成,並且沒有分隔符,所以不可能知道命令何時結束以及參數何時開始。或者對命令和參數還有其他要求嗎?看起來命令總是3個字符並且參數爲2. – RoToRa 2010-08-06 09:09:54

+0

粗體和斜體文本表示已識別的組。也許我寫過多雲,應該提及我使用RegexBuddy。參數和命令沒有指定長度。在字符串2中,我有命令abc和參數dd。只有當我知道命令時,參數纔是重要的。 ghi不被稱爲命令,因此不需要獲取參數。 – CSchulz 2010-08-06 09:38:26

回答

1

,也許這將這樣的伎倆爲您提供:

(abc|def)(\d+|(?:(?!(?1))[a-z])+)?|((?:(?!(?1))[a-z])+)((?2))? 

編輯。糟糕,這意味着編輯我以前的答案,而不是張貼新的答案。

測試用例:

<?php 

$r = '#(abc|def)(\d+|(?:(?!(?1))[a-z])+)?|((?:(?!(?1))[a-z])+)((?2))?#'; 
$s1 = 'abc20def20ghi20'; 
$s2 = 'abcdddef20ghi20'; 
$s3 = 'abcdddef2d0ghi20abcdd'; 

preg_match_all($r, $s1, $m1); 
preg_match_all($r, $s2, $m2); 
preg_match_all($r, $s3, $m3); 
var_dump($m1[0], $m2[0], $m3[0]); 

輸出:

array(3) { 
    [0]=> 
    string(5) "abc20" 
    [1]=> 
    string(5) "def20" 
    [2]=> 
    string(5) "ghi20" 
} 
array(3) { 
    [0]=> 
    string(5) "abcdd" 
    [1]=> 
    string(5) "def20" 
    [2]=> 
    string(5) "ghi20" 
} 
array(5) { 
    [0]=> 
    string(5) "abcdd" 
    [1]=> 
    string(4) "def2" 
    [2]=> 
    string(2) "d0" 
    [3]=> 
    string(5) "ghi20" 
    [4]=> 
    string(5) "abcdd" 
} 

正如你所看到的,它可以捕獲來自正常兩個字符串的所有部分。

+0

差不多。 :)我曾考慮過這種前瞻,但我不明白。唯一的一點是,它並不完全適用於字符串1,abc後的dd將被忽略,並且ghi在兩個字符串中都將被忽略。 – CSchulz 2010-08-06 10:05:13

+0

好的,更新了正則表達式以將這些情況考慮在內,現在應該可以工作。我也改變了使用'(?1)'的前瞻,所以如果你想添加新的命令,你只需要編輯第一個命令列表。 – 2010-08-06 10:18:02

+0

非常好的工作,但我的RegexBuddy說,有一些錯誤,我不知道如何解決它。我同時在一個非常簡單的版本'(abc | def | [a-z] *)+?(?!(abc | def))'中開發了你的正則表達式。 :D – CSchulz 2010-08-06 10:21:58

0

你總是想要捕獲長度爲5的字符串嗎?如果是這樣,你可以這樣做:

([a-z]{3})([0-9a-z]{2}) 

如果沒有,也許你可以澄清,究竟什麼是「禁」「abcdd」和「def20」之間的字符串的標準是什麼?根據您的最新評論

+0

不,我很抱歉,但命令和參數沒有任何指定的長度。 – CSchulz 2010-08-06 09:39:02