我想在长字符串中找到单词的位置。该单词可以在特殊字符之前或之后,但不能是字母数字字符。所以,如果我搜索德国和字符串包含德国!或者$ germany或$ germany)(或德国我想要它的位置。我怎么能为此写一个正则表达式。我试过这个(?i)(?< = ^ | [^ az])德国(?= $ | [^ az])但它没有用。
String s="(?i)(?<=^|[^a-z])germany(?=$|[^a-z])";
Pattern p= Pattern.compile("(?i)(?<=^|[^a-z])cat(?=$|[^a-z])");
Matcher m=p.matcher(" germany@ is germany");
System.out.println(m.matches());
每次都返回一个假。你能建议一个正确的方法吗?我想找到这样的词并替换它们。
答案 0 :(得分:2)
虽然上面的答案是正确的,但使用这个正则表达式可以提高效率
Pattern p = Pattern.compile("(?<![^\\W_])" + string + "(?![^\\W_])");
你的工作应该花更少的时间用这个
答案 1 :(得分:1)
您需要使用matcherobject.find()
方法来查找匹配的子字符串。 matches方法将尝试针对整个输入字符串检查正则表达式。
Pattern p= Pattern.compile("(?i)(?<=^|[^A-Z0-9a-z])germany(?=$|[^A-Z0-9a-z])");
如果不是字母数字,则需要在否定字符类中使用A-Z0-9
。
ArrayList<Integer> positions = new ArrayList();
String s = "germany@ is germany";
Pattern p= Pattern.compile("(?i)(?<=^|[^a-zA-Z\\d])(g)ermany(?=$|[^a-zA-Z\\d])");
Matcher m=p.matcher(s);
while(m.find())
{
positions.add(m.start());
}
System.out.println(positions);
<强>输出:强>
[0, 12]