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

时间:2011-12-02 03:56:35

标签: java regex

我已经查看了我在这里可以找到的每一篇文章,但无法弄明白。

我有一个看起来像这样的字符串:“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。

感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您可以使用前瞻和OR的组合,如下所示:

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

这将从任何输入中检索字符串“5989”,其中包含任何一个数字,例如它将找到“5989”,“3989”或“5949”而不是“5181”。< / p>

如果您不关心检索匹配,只需执行以下操作:

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