【问题标题】:EditPad: Need a regex that handles multiple possible data formatsEditPad:需要一个处理多种可能数据格式的正则表达式
【发布时间】:2014-04-24 19:09:05
【问题描述】:

首先,我使用 EditPadPro 进行正则表达式清理,所以给出的任何答案都应该在该环境中工作。

我得到了一个很大的电子表格,里面装满了我每天都必须清理的数据。我已经设法将它归结为我运行的几个不同的正则表达式,这很有效......但我很好奇是否有可能减少到一个正则表达式。

这是一些示例数据:

3-CPC_114851_70095_70095_CAN-bre
3-CPC_114851_70095_70095_CAN
b11-ao1-113775-bre
b7-ao-114441
b7-ao-114441-bre
b7-ao1-114441
b7-ao1-114441-bre
http://go.nlvid.com/results1/?http://bo
go.nlv/results1/?click
b4-sm-1359
b6-sm-1356-bre
1359_195_1453814569-bre
1356_104_1456856729
b15-rad-8905
b15-rad-8905-bre

以下是上述数据的最终结果:

114851-bre
114851
113775-bre
114441
114441-bre
114441
114441-bre
http://go.nlvid.com/results1/
go.nlv/results1/
sm-1359
sm-1356-bre
sm-1359-bre
sm-1356
rad-8905
rad-8905-bre

所以,有很多规则,例如:

  • 在超过 2 个下划线的情况下,结果只需要包含第一个下划线之后的值,以及从破折号开始的所有内容。
  • 如果字符串包含“-ao-”、“-ao1-”,则应删除最终数字字符串之前的所有内容。
  • 如果存在问号,则应删除从标记开始的所有内容。
  • 如果字符串包含“-sm-”或“-rad-”,则应删除这些字母字符串之前的所有内容。
  • 如果字符串包含 2 个下划线,则在第一个数字字符串之后的所有内容直到破折号 (如果存在)应该被删除,并且应该在前面加上字符串“sm-”。

此外,还有其他数据必须保持不变,包括但不限于:

113535|24905|24905

以及这种 xxxxxx|yyyyy|zzzzz 模式的许多变体(并不总是那些字符串长度)

这可能对正则表达式的要求太多了,我不确定,因为我不太擅长。但我已经看到了一些令人印象深刻的事情,所以我想我会把它发布给社区,看看你会得到什么。

【问题讨论】:

  • 嘿乔纳森,为了完成,我已经编辑了我的答案,并为您提供了在 EPP 中做您想做的事情的解决方案。我们将两个正则表达式保存到收藏夹,然后录制一个简短的宏。这真的很容易,因为“sm-”,没有其他方法可以获取最后一个正则表达式。希望这对您有用,如果您有任何问题,请告诉我。
  • 另外,修正了正则表达式中的几个错别字(有几个我替换了匹配项,但没有费心匹配要删除的字符串的结尾。)粘贴了宏供您查看。

标签: regex editpad


【解决方案1】:

乔纳森,我可以将所有这些都包装到一个正则表达式中,除了最后一个(您将 sm- 添加到不包含 sm 的字符串之前)。在这种情况下这是不可能的,因为我们无法捕获“sm”以在替换中重用,并且因为 EPP 中没有“条件替换”语法。

话虽如此,您可以在 EPP 中实现您想要的,使用两个正则表达式和一个宏来链接两者。

方法如下。

下面的解决方案在 EPP 中进行了测试。

正则表达式 1

  1. 按 Ctrl + Sh + F 进入搜索/替换模式
  2. 在相应的框中输入以下搜索和替换
  3. 在搜索栏的右上角,单击“收藏搜索”下拉菜单,选择“添加”,为其命名,例如正则表达式 1

搜索:

(?mx)^
(?=(?:[^_\r\n]*?_){3})[^_\r\n]+?_([^_\r\n]+)[^-\r\n]+(-[^\r\n]+)?
|
[^\r\n]*?-ao1?-\D*([^\r\n]+)
|
([^\r\n?]*)(?=\?)[^\r\n]+
|
[^\r\n]*?-((?:sm|rad)-[^\r\n]+)

替换:

\1\2\3\4\5

正则表达式 2

与上述相同的 1-2-3 步骤。

搜索

^(?!(?:[^_\r\n]*?_){3})(?=(?:[^_\r\n]*?_){2})(\d+)(?:[^-\r\n]+(-[^\r\n]+)?)

替换

sm-\1\2

链接正则表达式 1 和正则表达式 2

  1. 顶部菜单:宏,录制宏,给它一个名字。
  2. 点击收藏搜索下拉菜单,选择 Regex 1
  3. 点击全部替换。
  4. 点击收藏搜索下拉菜单,选择 Regex 2
  5. 点击全部替换。
  6. 宏,停止录制。
  7. 当您想要执行替换序列时,请在“宏”菜单下按名称拉取它。

测试一下

我已经根据您的输入测试了我的“Jonathan 宏”。结果如下:

114851-bre
114851
113775-bre
114441
114441-bre
114441
114441-bre
http://go.nlvid.com/results1/
go.nlv/results1/
sm-1359
sm-1356-bre
sm-1359-bre
sm-1356
rad-8905
rad-8905-bre

【讨论】:

  • 有趣,感谢您的尝试!尽管它并没有完全达到我想要的效果,但我希望可以从您的回复中学到一两件事。 =)
  • @JonathanvanClute EPP 和正则表达式 uberexpert (Jan) 的作者证实了我的怀疑,即没有已知的技巧来捕获不在字符串中的文本:I don't know of any regex engine that allows you to capture text that is not actually matched. You can use capturing groups inside lookaround to capture text that is not included in the overall match, but that text still needs to be matched while the lookaround is attempted. 如果您有任何问题,请告诉我乔纳森。您最初的问题是什么是可能的,而 IMO 这个答案让您在 EPP 中获得最接近的结果。
  • 这很有趣,感谢您的更新。不幸的是,给出的两个答案在某些方面都有效,而在其他方面则失败了。您的未能处理以下问题 - 3-CPC_114851_70095_70095_CANhttp://go.nlvid.com/results1/?http://bogo.nlv/results1/?click1356_104_1456856729(最后,它不仅未能在前面加上 sm- 正如您解释的那样无法完成,但实际上并没有处理字符串)。所以坦率地说,我必须回答两者都部分有效。在关闭此之前,我将稍等片刻,看看是否有人提出更接近我所希望的东西。
  • 哦,哇,在此之前我对在 EPP 中使用宏并不熟悉。有了这个功能,我已经可以使用我拥有的正则表达式来完成这个任务。感谢您的所有努力!
  • @JonathanvanClute 不客气,很高兴它成功了。是的,宏很容易设置,不是吗?顺便说一句,如果由于任何原因需要大量编辑一个长宏,而不是重新录制,您可以导出它,打开文件,在里面编辑,再次导入。
【解决方案2】:

试试这个:

  1. 切换搜索面板:SHIFT+CTRL+F
  2. 搜索:.*?((?:sm-|rad-)?(?:(?:\d+|[\w\.]+\/.*?))(?:-\w+)?$)
  3. 替换:$1
  4. 检查REGEXWORDS
  5. 点击Replace All或点击CTRL+ALT+F3

查看下图:

【讨论】:

  • 谢谢,但我不确定你说它需要修饰符是什么意思。我如何将它们合并到正则表达式中?
  • 给我几分钟,我会为你调查一下
  • @JonathanvanClute 请尝试不带任何修饰符的正则表达式,检查它是否有效。
  • 我确实试过了,它似乎没有做任何事情。它突出显示它正在搜索的结果,它似乎突出显示与我需要的完全相反的结果,但是替换似乎只是用它自己替换它,所以实际上什么也没发生。
  • @JonathanvanClute 好的,我会看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多