Java:查找第一个正则表达式的索引

9
我需要修改一段代码,其中包含以下内容:
string.indexOf("bc")

如何通过一种解决方案跳过字母"a"之前的"bc"出现。不想找到这些内容:abc,只想找到xbc,其中x可以是任何字符但不能为a(即使为空)。我认为可以设置一个条件来检查索引i-1是否等于a,如果为真则再次调用indexOf方法。但我认为这样的代码不够优美。使用正则表达式的解决方案会是什么样子呢?编辑:看到一些回复后,提供一个提示。不仅需要正则表达式,还需要API调用来查找索引位置。
4个回答

19

按照要求提供更完整的解决方案:

    /** @return index of pattern in s or -1, if not found */
public static int indexOf(Pattern pattern, String s) {
    Matcher matcher = pattern.matcher(s);
    return matcher.find() ? matcher.start() : -1;
}

调用:

int index = indexOf(Pattern.compile("(?<!a)bc"), "abc xbc");

好的,我的编辑更多是对那些只包含单个正则表达式答案的回应。但无论如何,谢谢,这看起来很不错。 - Hans Wiener
如果你想在其上进行索引,可以这样做:public static int indexOf(String regex, String s, int index) { Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(s); return matcher.find(index) ? matcher.start() : -1; }...int index = indexOf("(?<!a)bc", "abc xbc", 2); - Andre Nel

5

您可以使用具有负向回顾后发的正则表达式:

(?<!a)bc

很不幸,在Java中用正则表达式复制.indexOf仍然很混乱:

Pattern pattern = Pattern.compile("(?!a)bc");
Matcher matcher = pattern.matcher("abc xbc");
if (matcher.find()) {
    return matcher.start();
}

负回溯似乎很符合要求。太遗憾了,API中没有一个.indexOf(Regex)。 - Hans Wiener
@HansWiener 抱歉,应该是 matcher.find()(看到了吗?这真是一团糟 :) )。 - kennytm
啊,这只是一个打字错误,我现在应该接受哪个版本?正则表达式中也有一个打字错误(缺少<)。 - Hans Wiener
说实话,如果找到一个正则表达式的匹配项,却无法检索字符串中找到的模式的起始或结束索引,那么这样做有什么意义呢?这就是为什么我拒绝使用Pattern和Matcher类的原因。它们太晦涩了,比有帮助的东西更加令人沮丧和浪费时间。你必须逐个字符地搜索字符串。我保证,通过这种方式,你可以更快地完成你的目标,并减少很多挫败感。 - JamisonMan111

2

补充Arne的回答 - 如果您想添加索引:

public static int indexOf(String regex, String s, int index)
{
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(s);
    return matcher.find(index) ? matcher.start() : -1;
}

呼叫:

int index = indexOf("(?<!a)bc", "abc xbc", 2);

1
使用正则表达式查找符合条件的字符串,然后找到该字符串的索引。
int index = -1;
Pattern p = Pattern.compile("[^Aa]?bc");
Matcher m = p.matcher(string);
if (m.find()) {
    index = m.start();
}

类似这样的内容。其中'string'是您要搜索的文本,'index'保存找到的字符串的位置。(如果未找到,则索引将为-1。)还请注意,除非设置标志,否则模式区分大小写。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接