正则表达式匹配两个字符,除非它们在另一个字符的两个位置内

时间:2010-06-28 02:06:25

标签: regex

我正在尝试创建一个正则表达式来匹配某些特定字符,除非它们出现在另一个字符中。

例如,我想匹配abc或xxabcxx但不匹配tabct或txxabcxt。
虽然像tabctxxabcxxtabcxt这样的东西我想要匹配中间abc而不是其他两个。

目前我正在尝试使用Java,如果它改变了什么。

2 个答案:

答案 0 :(得分:1)

试试这个:

String s = "tabctxxabcxxtabcxt";
Pattern p = Pattern.compile("t[^t]*t|(abc)");
Matcher m = p.matcher(s);
while (m.find())
{
  String group1 = m.group(1);
  if (group1 != null)
  {
    System.out.printf("Found '%s' at index %d%n", group1, m.start(1));
  }
}

输出:

Found 'abc' at index 7

t[^t]*t会消耗t中包含的所有内容,因此,如果第二个备选方案中的(abc)匹配,则您知道它是您想要的那个。

答案 1 :(得分:0)

EDITED!之前有点不对劲。

哦,这个比我想象的更难。真棒。使用相当标准的语法:

[^t]{2,}abc[^t]{2,}

这将捕获xxabcxx但不捕获abc,xabc,abcx,xabcx,xxabc,xxabcx,abcxx或xabcxx。也许最好的办法是:

if 'abc' in string:
    if 't' in string:
        return regex match [^t]{2,}abc[^t]{2,}
    else:
        return false
else:
    return false

这对你的意图是否足够?