想象一下,我们有一个包含子串'cat'和'dog'以及其他随机字符的长字符串,例如。
cat x dog cat x cat x dog x dog x cat x dog x cat
这里'x'代表任意字符的随机序列(但不是'cat'或'dog')。
我想要做的是找到除了'dog'之外的任何字符后面跟随'cat'的每个'cat'。我想在每种情况下删除第一个'cat'实例。
在这种情况下,我想删除括号[cat],因为在下一个'cat'之前没有'dog':
cat x dog [cat] x cat x dog x dog x cat x dog x cat
最终:
cat x dog x cat x dog x dog x cat x dog x cat
如何做到这一点?
我想过以某种方式使用像(n)(?=(n))这样的正则表达式作为VonC推荐的 here
(cat)(?=(.*cat))
匹配字符串中的所有'cat'对。但是我仍然不确定如何使用它来移除每只在'cat'之前没有跟着'dog'的猫。
我正在处理的真正问题是Java。但我真的只是在寻找一般的伪代码/正则表达式解决方案。
答案 0 :(得分:2)
您是否有任何特殊原因只想通过一次RE呼叫进行此操作?我不确定这是否真的可以在一个RE。
如果我必须这样做,我可能会分两次通过。首先在字符串中标记'cat'和'dog'的每个实例,然后编写一些代码以识别需要删除哪些猫,并在另一次传递中执行此操作。
伪代码如下:
// Find all the cats and dogs
int[] catLocations = string.findIndex(/cat/);
int[] dogLocations = string.findIndex(/dog/);
int [] idsToRemove = doLogic(catLocations, dogLocations);
// Remove each identified cat, from the end to the front
for (int id : idsToRemove.reverse())
string.removeSubstring(id, "cat".length());