正则表达式:有条件地替换单词

时间:2014-08-25 07:57:35

标签: java regex

我正在尝试找到一个可以匹配字符的正则表达式并有条件地替换它们。虽然我在寻找角色方面有所成功,但在替换时我发现了一些问题。

例如: 如果我有一个字符串说" mnh ghty stuf"

所以我用a=1 b=2 c=3 till y=25

替换每个字符

所以它的输出将是" 123 4567 891011"

但如果我发现第一个字母盯着字母K的字词不应该被替换

即ex = abc kdefg hijk its output must be like this 123 kdefg 891011

任何1可以告诉我该怎么做?

我尝试了下面的代码,但它没有用。

if(count>0) 
{ 
    str = ""; 
    String str123=enter_text.getText().toString().toLowerCase(); 
    Matcher matcher = Pattern.compile("t(\\w+)(\\s)").matcher(enter_text.getText().toString().toLowerCas‌​e()); 
    while(matcher.find()) 
    { 
        str1=matcher.group(1); 
        System.out.println("k letter "+str1); 
    } 
    str=enter_text.getText().toString().toLowerCase(). replace("a","1"). replace("b","2"). replace("c","3"). replace("d","4"). replace("e","5"). 
} 

任何帮助都非常感激。

3 个答案:

答案 0 :(得分:3)

常见:

final String        input  = "abc kdefg hijk";
final StringBuilder output = new StringBuilder( 1024 );

第一种方法:

final Pattern pattern = Pattern.compile( "(\\w+)" );
final Matcher matcher = pattern.matcher( input );
while( matcher.find()) {
   final String word = matcher.group( 1 );
   output.append( ' ' );
   if( word.charAt( 0 ) == 'k' ) {
      output.append( word );
   }
   else {
      for( int i = 0; i < word.length(); ++i ) {
         output.append( 1 + word.charAt( i ) - 'a' );
      }
   }
}

第二种方法:

final String[] words = input.split( "\\W+" ) ;
for( final String word : words ) {
   output.append( ' ' );
   if( word.charAt( 0 ) == 'k' ) {
      output.append( word );
   }
   else {
      for( int i = 0; i < word.length(); ++i ) {
         output.append( 1 + word.charAt( i ) - 'a' );
      }
   }
}

常见:

System.out.println( output.toString());

两种情况下的输出相同:

123 kdefg 891011

答案 1 :(得分:0)

选项1:

(?:\b([^k ]+\w+\b)|(\b[k]\w+\b))

DEMO

它捕获两个不同的组,第一个被替换,第二个被保留。

选项2:

\b([^k ]+\w+\b)

它仅捕获不以k开头的作品,在您进行转换的匹配循环上,并用转换后的字符串替换原始匹配。

我不习惯使用Java来提供演示代码,只为我提供正则表达式:)

如果没用,请告诉我,我会删除。

答案 2 :(得分:0)

我的Java生锈但我会使用这个正则表达式:

String str123=enter_text.getText().toString().toLowerCase();
Matcher matcher = Pattern.compile("\bk\w*|([a-z])").matcher(str123); 

然后,如果组1不存在,则跳过该组或将其替换为整个匹配(实际上什么都不做)。如果存在第1组,则将其替换为:

Integer.toString(Character.codePointAt(matcher.group(1), 0) - 96);

codePointAt为您提供字母的ASCII值。 a = 97,所以减去96会给你1等等。