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

Java:查找第一个正则表达式的索引,java,regex,Java,Regex,我需要更改一段代码,其中包括: string.indexOf("bc") 如果在“bc”前面加上字母“a”,那么解决方案将跳过“bc”的出现,如何改变这一点 我不想找到这些: abc 但仅限于: xbc 其中x可以是a以外的任何值(甚至是空的) 我想我可以设置一个条件,检查索引I-1==a,如果为true,再次调用indexOf方法。但我认为这不会产生非常漂亮的代码 使用正则表达式的解决方案会是什么样子 编辑:只是在看到一些回复后的提示。不仅可以获得正则表达式,还可以获得查找索引所需的API调

我需要更改一段代码,其中包括:

string.indexOf("bc")
如果在“bc”前面加上字母“a”,那么解决方案将跳过“bc”的出现,如何改变这一点

我不想找到这些:

abc

但仅限于:

xbc

其中x可以是a以外的任何值(甚至是空的)

我想我可以设置一个条件,检查索引I-1==a,如果为true,再次调用indexOf方法。但我认为这不会产生非常漂亮的代码

使用正则表达式的解决方案会是什么样子


编辑:只是在看到一些回复后的提示。不仅可以获得正则表达式,还可以获得查找索引所需的API调用。

您可以使用带有负数的正则表达式:


使用正则表达式查找与条件匹配的字符串,然后查找该字符串的索引

int index = -1;
Pattern p = Pattern.compile("[^Aa]?bc");
Matcher m = p.matcher(string);
if (m.find()) {
    index = m.start();
}

像这样的。其中“string”是您正在搜索的文本,“index”保存找到的字符串的位置。(如果找不到索引,则索引将为-1。)另外请注意,除非您设置了标志,否则该模式区分大小写。

根据要求提供更完整的解决方案:

    /** @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((?)添加到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((?反向查找似乎非常准确。太糟糕了,API中没有.indexOf(Regex)。@Hanswiner很抱歉,它应该是
matcher.find()
(请参见?它很混乱:)。啊,这只是一个输入错误,我现在应该接受哪个版本?Regex表达式中还有一个输入错误(坦白说,如果无法检索字符串中找到的模式的起始索引或结束索引,那么查找与reg exp的匹配项有什么意义?这就是我拒绝使用模式和匹配器类的原因。它太神秘,而且比帮助更令人沮丧和浪费时间。你必须逐个char.Y清理字符串。)我保证,我的编辑更多的是对只包含一个正则表达式的答案的响应。但无论如何,谢谢你,这看起来很不错。如果你想在上面做索引,你可以做:public static int indexOf(String regex,String s,int index){Pattern Pattern=Pattern.compile(regex);Matcher Matcher=Pattern.Matcher(s);返回Matcher.find(index)?Matcher.start():-1;}…int index=indexOf((?)?
    /** @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");
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);