只有当该模式恰好出现一次时,正则表达式才能匹配模式吗?

时间:2012-05-03 20:01:51

标签: java regex

举个例子:

string1 = "aaxadfxasdf"

string2 = "asdfxadf"

string3 = "sadfas"

我需要一个匹配x的模式,以便它仅为string2返回x的匹配。

注意:出于这个问题的目的,我必须使用java正则表达式。此外,我无法访问代码,所以我不能简单地检查java regex对象返回的匹配数。


嘿所有,

感谢您的回复,其中一些回答了我的问题。我的例子并不像我需要的那样具体。所以,让我把这个怪癖添加到混合中:

如果我匹配的不止一个字符怎么办?

string4 = "This is a sentence!"
string5 = "This is just another sentence with some repetition in it. This is a   sentence"
string6 = "this is"

在这种情况下,我只想在字符串中出现一次时才匹配“句子”。

此外,虽然未在示例中表示,但我需要能够跨行搜索。

4 个答案:

答案 0 :(得分:4)

^[a-wy-z]+x[a-wy-z]+$

我不确定您是否只是期待字母,或者您想要匹配的x之前和之后是否包含符号和数字。如果是,请使用[^x]代替[a-wy-z],如下所示:

^[^x]+x[^x]+$

如果您还希望自己匹配x,请将+符号替换为*,如下所示:

^[a-wy-z]*x[a-wy-z]*$

答案 1 :(得分:4)

^[^x]*x[^x]*$

其中第一个^是行的开头($是结尾),但另一个^表示字符集的补码

答案 2 :(得分:1)

你可以使用有限状态自动机来完成它,因此你可以使用正则表达式来完成它。

(all the chars except x)*x(all the chars except x)*

答案 3 :(得分:1)

这将匹配由'asdf'和'adf'(它是贪婪的)所包围的任何字符串。

(?=asdf).+(?<=adf)

非贪婪:

(?=asdf)((?<!adf).)+(?<=adf)

边界更严格:

^(?=asdf)((?<!adf).)+(?<=adf)$