【问题标题】:String pattern matching problem字符串模式匹配问题
【发布时间】:2011-05-01 23:58:46
【问题描述】:

假设我们有一个长字符串,其中包含子字符串 'cat' 和 'dog' 以及其他随机字符,例如。

cat x dog cat x cat x dog x dog x cat x dog x cat

这里的“x”代表任意随机的字符序列(但不是“猫”或“狗”)。

我想要做的是找到每一个“猫”,然后是“狗”以外的任何字符,然后是“猫”。在每种情况下,我都想删除“cat”的第一个实例。

在这种情况下,我想删除括号中的 [cat],因为在下一个“猫”之前没有“狗”:

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

如何做到这一点?

我想以某种方式使用像 VonC 推荐的 (n)(?=(n)) 这样的正则表达式 here

(cat)(?=(.*cat))

匹配字符串中的所有“cat”对。但我仍然不确定如何使用它来删除每只在 'cat' 之前没有跟随 'dog' 的猫。


我要解决的真正问题是 Java。但我真的只是在寻找一个通用的伪代码/正则表达式解决方案。

【问题讨论】:

  • 嗨。了解您使用的语言会很有用。
  • @klausbyskov:你确定那个编辑吗?以下两句话和例子在我看来似乎表明“跟随”确实是他的意思。
  • 我的意思是“跟随”而不是之前!
  • 对不起那些家伙。我的错。

标签: regex string pattern-matching


【解决方案1】:

您有什么特别的原因想通过一次 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());

【讨论】:

    猜你喜欢
    • 2021-04-25
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 2019-09-07
    • 2020-07-12
    • 2011-06-15
    • 2011-09-08
    相关资源
    最近更新 更多