我想替换以“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#
答案 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
答案 1 :(得分:1)
这个怎么样:
(?<=[lmts])h(?=\s|$)
工作正则表达式示例:
的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", "#"));
}
}