2014-09-20 293 views
0

我試圖使用或者兩個規則刪除特定字符串的一部分:正則表達式匹配字符串

  1. 消除所有的輔音(S)在字符串的開頭
  2. 消除字符串開頭的所有輔音字母。

假設我的字符串是str。 ${str%%[aeoui]{1}*}正確的第二個規則?我不知道第一條規則該怎麼做。

+0

其實如果我刪除了{1}在表達式中工作得很好。 – 2014-09-20 01:30:26

回答

0

我不確定你想用什麼語言來實現它,所以我只是使用一些通用的語法。

1. s/^[^aeiouAEIOU]*(.*)/\1/ 
2. s/^[aeiouAEIOU]*(.*)/\1/ 

有些方法可以使其不區分大小寫,但爲了清晰起見,我喜歡這樣具體。

這兩者之間的唯一區別是[]裏面的^只是否定了它。

*表示零或更多。例如,如果使用+,則#1中至少要有一個輔音,#2中至少要有一個元音,否則測試將失敗。

用我的通用語法\1返回(.*)發現的內容。

下面是一些很簡陋的Perl證明(其中$1在打印語句在我的例子上述表現爲\1):

#!/usr/bin/perl                 

$string1="abcdef"; 
$string2="fedcba"; 

if ($string1 =~ /^[aeiouAEIOU]*(.*)/) { 
    print "Test 1 on $string1: $1\n"; 
} 

if ($string2 =~ /^[aeiouAEIOU]*(.*)/) { 
    print "Test 1 on $string2: $1\n"; 
} 

if ($string1 =~ /^[^aeiouAEIOU]*(.*)/) { 
    print "Test 2 on $string1: $1\n"; 
} 

if ($string2 =~ /^[^aeiouAEIOU]*(.*)/) { 
    print "Test 2 on $string2: $1\n"; 
} 

而這裏的輸出:

Test 1 on abcdef: bcdef 
Test 1 on fedcba: fedcba 
Test 2 on abcdef: abcdef 
Test 2 on fedcba: edcba 
+0

第一個正則表達式比所有輔音刪除得多得多,而第二個正則表達式比輔音節點中的所有輔音節點都少得多。 – Toto 2014-09-20 10:07:08

+0

你如何測試這個會導致你得出這個結論? – nelsonov 2014-09-20 13:50:18

+0

例如,從字符串中刪除所有特殊字符和數字(用'/ 123abc'測試,AFAIK'/ 123'不是輔音),第二個字符保留這些字符。這不是OP想要的。其中的一部分,不要在替換部分使用'\ 1',使用'$ 1','\ 1'保留給正則表達式部分。 – Toto 2014-09-21 09:27:09