Regex EditPad:需要一个处理多种可能数据格式的正则表达式

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

首先,我正在使用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
因此,有许多规则,例如:

  • 如果有两个以上的下划线,则结果只需包含紧跟在第一个下划线之后的值,以及从破折号开始的所有内容
  • 如果字符串包含“-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

  • 按Ctrl+Sh+F进入搜索/替换模式
  • 在适当的框中输入以下搜索和替换
  • 在搜索栏右上角,单击收藏夹搜索下拉列表,选择“添加”,为其命名,例如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

  • 顶部菜单:宏,录制宏,给它命名
  • 单击收藏夹搜索下拉列表,选择正则表达式1
  • 点击全部替换
  • 单击收藏夹搜索下拉列表,选择正则表达式2
  • 点击全部替换
  • 宏,停止录制
  • 无论何时,只要您想执行替换序列,请在“宏”菜单下按名称拖动它
  • 测试此功能

    我已经在您的输入上测试了我的“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
    

    谢谢,但我不知道你说的是什么意思,需要修改。我该如何将它们合并到正则表达式中?给我几分钟时间,我将对此进行调查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不客气,很高兴它成功了。是的,宏很容易设置,不是吗?顺便说一句,如果出于任何原因,有一个长宏需要大量编辑,而不是重新录制,你可以将其导出,打开文件,在内部编辑,然后再次导入。嘿,乔纳森,为了完成我的编辑