在非分隔字符串中使用通配符定位字符串的正则表达式



我已经检查了我能找到的每一篇文章,但还是没有找到。

我有一个字符串,看起来像这样:"ABC1234598901AC"

我试图使用正则表达式来匹配字符串中的"5989",但我希望能够匹配该字符串,即使其中一个字符是不同的。

为了简化,假设我正在搜索字符串"59(非8的随机字符)9"。

现在这里是我的正则表达式:"59[^8]9",但当我在Java中使用Matcher时,它根本不匹配。

下面是我用来测试的代码:

Matcher test = Pattern.compile("59[^8]9").matcher("ABC1234598901AC");
if (test.matches())
{
System.out.println(test.start());
System.out.println(test.end());
}

Test.matches()永远不会求值为true。

任何帮助都是感激的,谢谢!

您要使用test.find(),而不是test.matches()

Matcher.matches()要求您的模式匹配整个输入(因此您需要用.*包围模式以使其匹配),而Matcher.find()在输入字符串中搜索与您的模式匹配的第一个(然后是随后的)子字符串。

您可以使用向前看和OR的组合,像这样:

input.replaceAll(".*((?=(.989|5.89|59.9|598.))....).*", "$1");

这将从任何一个数字的输入中检索字符串"5989",例如,它将找到"5989","3989"或"5949",但不找到"5181"。

如果您不关心检索匹配,只需这样做:

if (input.matches(".*(.989|5.89|59.9|598.).*")) {
    // it would be true for "5989", "3989" or "5949" but not "5181"
}

最新更新