2011-12-02 111 views
2

我已经检查过每一个可以在这里找到的帖子,但是无法弄清楚。正则表达式在非分隔字符串中查找带有通配符字符串的字符串

我有一个字符串,它看起来是这样的:“ABC1234598901AC”

我试图用一个正则表达式匹配“5989”的字符串中,但我希望能够到该字符串匹配连如果其中一个角色是不同的。

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

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

下面是我使用来测试这个代码:

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。

任何帮助表示赞赏,谢谢!

+0

任何问题我的回答,这实际上* *回答您的问题(而不是到不其他反应)? – Bohemian

回答

2

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

Matcher.matches()需要你的模式相匹配的整个输入(因此你需要环绕图案.*它匹配),而Matcher.find()搜索输入的字符串匹配于第一(然后随后的)子你模式。

+0

哦,我不能相信我错过了。谢谢马克,它解决了它!这确实解释了为什么当我添加查看整个字符串时,它会返回结果。我现在还不能接受,但会在10分钟内让我接受。 – David

1

您可以使用和前瞻的组合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" 
} 
相关问题