9

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

string.indexOf("bc")

如果它前面有字母“a”,那么如何通过跳过“bc”出现的解决方案来改变它。

我不想找到这些:

美国广播公司

但只有:

xbc

其中 x 可以是除了 a 之外的任何东西(甚至是空的)。

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

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

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

4

4 回答 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");
于 2012-06-26T19:39:11.373 回答
5

您可以使用带有否定后视的正则表达式

(?<!a)bc

不幸的是,用 Java 中的 Regex 重现.indexOf仍然是一团糟:

Pattern pattern = Pattern.compile("(?!a)bc");
Matcher matcher = pattern.matcher("abc xbc");
if (matcher.find()) {
    return matcher.start();
}
于 2012-06-26T19:05:58.003 回答
1

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

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

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

于 2012-06-26T19:10:09.947 回答
1

要添加到 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);
于 2017-11-01T11:39:42.217 回答