【问题标题】:RegEx expression to remove duplicate word groups用于删除重复词组的正则表达式
【发布时间】:2021-06-09 22:48:06
【问题描述】:

我正在尝试从以下文本中删除重复值:

[John Smith][John Smith][Jane Doe][Jane Doe][Doe][John][Smith John][John Smith Sr]

但是,我需要将括号内的每组单词视为唯一值。这样,如果单个单词出现在多个括号内,但括号内的单词组不同,我会保留所有值。

使用我的示例文本,我希望得到以下内容,

[John Smith][Jane Doe][Doe][John][Smith John][John Smith Sr]

但是当我使用这个正则表达式(?:\[)(.+)(?:\])(?=.*\b\1,?)时,我得到了以下文本

[Jane Doe][Doe][Smith John][John Smith Sr]

我哪里错了?感谢我能得到的任何帮助。

【问题讨论】:

  • 你在使用 Javascript 吗?

标签: regex


【解决方案1】:

捕获每个遇到的方括号子字符串,然后检查相同的子字符串是否再次出现在字符串中 - 如果是,则替换它。

(\[[^]]+])(?=.*\1)

使用否定字符类 ([^]]) 允许使用贪婪量词 + 而不会“过度匹配”——这意味着正则表达式不会浪费时间在稍后尝试匹配多个连续的方括号回溯到较小的潜在匹配之前的字符串。

https://regex101.com/r/OD1hia/1

如果使用 javascript 或其他需要转义否定字符类中的右大括号的环境,请在此处添加斜杠。

https://regex101.com/r/Wm3K4f/1

在 Stack Overflow 上会有很多这种技术的重复,但我没有找到需要方括号的确切“雪花”重复。

【讨论】:

  • 请注意,在 JS 中,此正则表达式不起作用(您应该使用 [^\]] 转义内部括号)。
  • 这项技术将在什么环境中实现完全没有区别。一旦澄清这一点,我就可以根据需要添加转义字符。
  • 我是否清楚为什么.+ 会花费额外的努力来尝试匹配[John Smith][John Smith][Jane Doe][Jane Doe][Doe][John][Smith John][John Smith Sr] 然后[John Smith][John Smith][Jane Doe][Jane Doe][Doe][John][Smith John] 然后[John Smith][John Smith][Jane Doe][Jane Doe][Doe][John] 然后[John Smith][John Smith][Jane Doe][Jane Doe][Doe] ...在找到一个足够小的重复然后它向前爬行并重复?点上的贪婪量词将从最长到最短的可能性起作用。我的答案仅在遍历时检查单个支撑子字符串。 @森
  • 我的答案检查:[John Smith] 然后[John Smith] 然后[Jane Doe] 然后[Jane Doe] 然后[Doe] 然后[John] 然后[Smith John] 然后[John Smith Sr]。 @森
  • 这个答案可以防止不必要的回溯 ++
【解决方案2】:

您还必须捕获第一组中的方括号:

(\[.+\])(?=.*\1)

通过这种方式,您可以确保检查重复的 w.r.t。整个刹车的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2013-01-08
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多