2014-09-20 255 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