2014-02-05 5 views
0


Я хочу заменить каждое слово, заканчивающееся на «h», но если символ до «h» был одним из этих (l|m|t|s), тогда нет необходимости заменять. это то, что я делаю в Java:regex specific char от конца слова

String t1="samplh sampleh samplah sampmh"; 
System.out.print(t1.replaceAll("(l|m|t|s)h","#")); 

, но это дает мне это (заменяет оба сгруппированных полукокса и «H»):

samp# sampleh samplah samp# 

он должен выглядеть следующим образом (только «ч "должны быть заменены на "#"):

sampl# sampleh samplah sampm# 
+0

У меня перехватило дыхание. Чтение этой строки t1 = "samplh sampleh samplah sampmh"; – zee

+0

Извините, я не понимаю логику, вы имеете в виду только тогда, когда h имеет гласную, прежде чем она должна быть заменена на #? Потому что в вашем примере все слова заканчиваются h. – m0skit0

+0

Вы говорите, что если «h» предшествует «l», тогда «h» не следует заменять, а затем вы говорите, что samplh должен быть sampl #. Это противоречиво. – mikea

ответ

1

Как об этом:

(?<=[lmts])h(?=\s|$) 

Рабочий пример регулярного выражения:

http://regex101.com/r/iR4zV0

Java:

String t1="samplh sampleh samplah sampmh"; 
System.out.print(t1.replaceAll("(?<=[lmts])h(?=\s|$)","#")); 

Выход:

sampl# sampleh samplah sampm# 
2

Это будет работать:

Find what: \b(\w+)([^lmts])(h)\b 
Replace with: $1$2# 

Java:

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 

/** 
    <P>{@code java ReplaceHAtEnd}</P> 
**/ 
public class ReplaceHAtEnd { 
    public static final void main(String[] igno_red) { 

     String sRegex = "" + 
     "\\b" +   //word start 
      "(\\w+)" +  //one or more characters 
      "([^lmts])" + //character other than l,m,t,s 
      "(h)" +   //the letter 'h' 
     "\\b";    //word end 

     String sToSearch = "samplh sampleh samplah sampmh"; 
     String sRplcWith = "$1$2#"; 
     Matcher m = Pattern.compile(sRegex).matcher(sToSearch); 

     StringBuffer sb = new StringBuffer(); 
     while(m.find()) { 
     m.appendReplacement(sb, sRplcWith); 
     m.appendTail(sb); 
     } 

     System.out.println(sb); 
    } 
} 

Выход:

[C:\java_code\]java ReplaceHAtEnd 
samplh sample# samplah sampmh sampla# sampmh 

Попробуйте на regexplanet: http://fiddle.re/hnqvf

или Debuggex

Regular expression visualization

+0

На самом деле вы хотите изменить '\ w +' на '\ w *'. – aliteralmind

1

Это регулярное выражение должно работать:

t1.replaceAll("(?<=[lmts])h\\b", "#"); 
0

Чтобы Утоли свое состояние - используйте следующее регулярное выражение: [^ (л | т | т | s)] ч \ б

\ б: word boundry [^ (л | т | т | s)]: предпоследнее слово не должно быть l или m или t или s

public class Test 
{ 
    public static void main(final String[] args) 
    { 
      final String t1 = "slhplh sampleh samplah sampmh"; 
      System.out.print(t1.replaceAll("[^(l|m|t|s)]h\\b", "#")); 
    } 
} 
Смежные вопросы