从一个单词的结尾开始的正则表达式特定字符

时间:2014-02-05 15:36:27

标签: java regex


我想替换以“h”结尾的每个单词,但如果“h”之前的字符是其中一个(l|m|t|s),则无需替换。 这就是我在java中所做的:

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

但它给了我(替换了分组的char和“h”):

samp# sampleh samplah samp#

它应该看起来像这样(只需“h”必须用“#”代替):

sampl# sampleh samplah sampm#

4 个答案:

答案 0 :(得分:2)

这将有效:

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

爪哇:

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

答案 1 :(得分: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 :(得分:1)

这个正则表达式应该有效:

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

答案 3 :(得分:0)

要满足您的条件 - 请使用以下正则表达式: [^(L | M | T | S)1 H \ B'/ P>

\ b:word boundry [^(l | m | t | 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", "#"));
    }
}