Regex EditPad:需要一个处理多种可能数据格式的正则表达式
首先,我正在使用EditPadPro进行正则表达式清理,所以给出的任何答案都应该在该环境中起作用 我得到了一个大的电子表格,里面装满了我每天都要清理的数据。我已经设法把它归结为我运行的两个不同的正则表达式,这很有效。。。但我很好奇,看看是否有可能减少到一个单一的正则表达式 以下是一些示例数据:Regex EditPad:需要一个处理多种可能数据格式的正则表达式,regex,editpad,Regex,Editpad,首先,我正在使用EditPadPro进行正则表达式清理,所以给出的任何答案都应该在该环境中起作用 我得到了一个大的电子表格,里面装满了我每天都要清理的数据。我已经设法把它归结为我运行的两个不同的正则表达式,这很有效。。。但我很好奇,看看是否有可能减少到一个单一的正则表达式 以下是一些示例数据: 3-CPC_114851_70095_70095_CAN-bre 3-CPC_114851_70095_70095_CAN b11-ao1-113775-bre b7-ao-114441 b7-ao-11
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
因此,有许多规则,例如:
- 如果有两个以上的下划线,则结果只需包含紧跟在第一个下划线之后的值,以及从破折号开始的所有内容李>
- 如果字符串包含“-ao-”、“-ao1-”,则应删除最终数字字符串之前的所有内容李>
- 如果出现问号,则应从问号开始删除所有内容李>
- 如果字符串包含“-sm-”或“-rad-”,则应删除这些alpha字符串之前的所有内容李>
- 如果字符串包含2个下划线,则在第一个数字字符串后平均到一个破折号 (如果存在)应移除,并且字符串“sm-”应加上前缀
113535 | 24905 | 24905
以及xxxxxx | yyyy | zzzzz这种模式的许多变体(并不总是那些字符串长度)
这可能是要求太多的正则表达式,我不确定,因为我不太适合它。但是我已经看到了一些令人印象深刻的东西,所以我想我应该把它公布给社区,看看你会得到什么。试试这个:
SHIFT+CTRL+F
*?((?:sm-| rad-)(?:(?:\d+|[\w\.]+\/.?)(?:-\w+?$)
$1
REGEX
和WORDS
Replace All
或点击CTRL+ALT+F3
乔纳森,我可以将所有这些都包装到一个正则表达式中,但最后一个除外(在最后一个正则表达式中,您将
sm-
前置到一个不包含sm
的字符串中)。在这种情况下是不可能的,因为我们无法捕获“sm”以在替换中重用,并且因为在EPP中没有“条件替换”语法
也就是说,您可以通过两个正则表达式和一个宏来链接这两个正则表达式,从而在EPP中实现您想要的功能
这里是如何
以下溶液在EPP中进行了测试
Regex 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
替换:
(?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
Regex 2
与上述1-2-3步骤相同
搜索
^(?!(?:[^_\r\n]*?_){3})(?=(?:[^_\r\n]*?_){2})(\d+)(?:[^-\r\n]+(-[^\r\n]+)?)
更换
sm-\1\2
链接正则表达式1和正则表达式2
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
谢谢,但我不知道你说的是什么意思,需要修改。我该如何将它们合并到正则表达式中?给我几分钟时间,我将对此进行调查u@JonathanvanClute请尝试不带任何修饰符的正则表达式,检查它是否有效。我确实尝试过,它似乎没有任何作用。它突出显示了它正在搜索的结果,并且似乎突出显示了与我所需要的正好相反的结果,但是替换结果似乎只是用它自己来替换,所以实际上什么都没有发生。@JonathanvanClute好的,我来看看。很有趣,谢谢你的尝试!尽管它并没有达到我想要的效果,但我希望能从你的回答中学到一两件事@EPP和regex uberexpert(Jan)的作者JonathanvanClute证实了我的怀疑,即没有已知的捕获不在字符串中的文本的技巧:
我不知道有任何regex引擎允许您捕获实际不匹配的文本。您可以使用“环顾”中的捕获组捕获未包含在整体匹配中的文本,但在尝试环顾时仍需要匹配该文本。
如果您有任何问题,请告诉我。你最初的问题是什么是可能的,在我看来,这个答案是你在EPP中能得到的最接近的答案。这很有趣,谢谢你的更新。不幸的是,这两个答案在某些方面都有效,但在其他方面都失败了。您的未能处理以下问题-3-CPC_114851_70095_70095_CAN
,http://go.nlvid.com/results1/?http://bo
,go.nlv/results1/?单击
,和1356_104_1456856729
(最后,它不仅未能预先结束sm-正如您所解释的那样无法完成,而且实际上根本没有处理字符串)。所以坦率地说,我必须回答这两个部分都起作用。在结束之前,我会等一等,看看是否有人提出了更接近我期望的东西。哦,哇,在这之前我不熟悉在EPP中使用宏。有了这个特性,我就可以用我拥有的正则表达式来实现这一点。谢谢你的努力@JonathanvanClute不客气,很高兴它成功了。是的,宏很容易设置,不是吗?顺便说一句,如果出于任何原因,有一个长宏需要大量编辑,而不是重新录制,你可以将其导出,打开文件,在内部编辑,然后再次导入。嘿,乔纳森,为了完成我的编辑