【问题标题】:EditPad RegEx ... I'm lostEditPad RegEx ...我迷路了
【发布时间】:2013-02-01 15:07:55
【问题描述】:

我正在尝试使用正则表达式进行另一种查找/替换,但我遇到了一些奇怪的字符。


总结:
某些行 (在这个克拉分隔的文件中) 在 peren 的 中有一个或两个特定标签(“(S)”或“(N)”) 跟在零件号后面,我需要将它移到 PN 之前。
注意:对于同时带有 (S) 和 (N) 的行,它将始终按以下顺序排列:(S)( N)


主题:

^901A-123^DESC,OF,PROD,AND,STUFF^$28.87^$23.10^--^--^--^--^^
^123B-C45(N)^DESC,OF,PROD,AND,STUFF^$1,224.87^$1,041.10^--^--^--^--^^
^333-11(S)(N)^DESC,OF,PROD,AND,STUFF^$510.67^$459.50^$382.90^2^$357.40^4^^
^333-987M-88(S)^DESC,OF,PROD,AND,STUFF^$608.77^$547.90^$456.50^2^$426.10^4^^


我的尝试:
我开始尝试 ^(.+)\(N\)^^([A-Za-z0-9]+)\(N\)^ 之类的东西,但很快就开始怀疑 ^(carat) 是否使事情复杂化,所以我尝试 逃避它。
这似乎没有什么区别:)
所以接下来我试着把所有的克拉都改成管道:

|901A-123|DESC,OF,PROD,AND,STUFF|$28.87|$23.10|--|--|--|--||
|123B-C45(N)|DESC,OF,PROD,AND,STUFF|$1,224.87|$1,041.10|--|--|--|--||
|333-11(S)(N)|DESC,OF,PROD,AND,STUFF|$510.67|$459.50|$382.90|2|$357.40|4||
|333-987M-88(S)|DESC,OF,PROD,AND,STUFF|$608.77|$547.90|$456.50|2|$426.10|4||

...并用|([A-Za-z0-9]+)\(N\)|搜索,现在我得到...等待它..... 什么都没有 :)


目标:
虽然现在我对找出 Find 的小胜利感到高兴,但最终目标是用反向引用替换(PN)。
目标是使主题看起来像这样:

^901A-123^DESC,OF,PROD,AND,STUFF^$28.87^$23.10^--^--^--^--^^
(N)^123B-C45^DESC,OF,PROD,AND,STUFF^$1,224.87^$1,041.10^--^--^--^--^^
(S)(N)^333-11^DESC,OF,PROD,AND,STUFF^$510.67^$459.50^$382.90^2^$357.40^4^^
(S)^333-987M-88^DESC,OF,PROD,AND,STUFF^$608.77^$547.90^$456.50^2^$426.10^4^^


欢迎任何和所有的指针/建议。

【问题讨论】:

    标签: regex replace backreference editpad


    【解决方案1】:
    • ^| 都是需要转义的元字符。
    • 您的字符类[A-Za-z0-9]+ 不包括破折号。

    所以,试试这个:搜索

    (\^[A-Za-z0-9-]+)((?:\(S\))?(?:\(N\))?)
    

    并替换为

    \2\1
    

    【讨论】:

    • 我会搜索^(\^[^^]*)((?:\(S\))?(?:\(N\))?)
    • @melpomene:你打算如何分离出(N)(S)?此外,在我看来,更明确地说明允许匹配的内容会更好。是否包括行首锚点取决于 OP 的需求。
    • @mOrloff:你什么意思?可以举个例子吗?
    • 一些“误报”是^DESC^--^2^4
    • 对,这些都是匹配的(但不会被替换操作改变)。如果您可以保证“正确”匹配只出现在行首,只需在正则表达式的开头添加^
    【解决方案2】:

    搜索:

    ^(.*?)(\((S\)\(N|S|N)\))(.*?)$
    

    替换为:

    $2$1$4
    

    由于我使用^$ 锚定了模式,因此您必须在每一行上分别应用此正则表达式或使用多行标志。

    这是working demo

    【讨论】:

    • 这很好用,我更喜欢这种语法(我更容易理解)...... mmdemirbas 的工作答案刚刚出现,所以我不得不给他。
    • 如您所愿,先到先得;)
    【解决方案3】:

    不幸的是,您正在使用特殊字符:^()|。 您需要逃脱所有这些。所以你可以使用这个正则表达式(见in action):

    \^([^\^]+?)(\(S\))?(\(N\))?(\^.*)
    

    并替换为:

    $2$3^$1$4
    

    我假设您只有在第一个标签之后才有 (S)(N)。输出如下所示:

    ^901A-123^DESC,OF,PROD,AND,STUFF^$28.87^$23.10^--^--^--^--^^
    (N)^123B-C45^DESC,OF,PROD,AND,STUFF^$1,224.87^$1,041.10^--^--^--^--^^
    (S)(N)^333-11^DESC,OF,PROD,AND,STUFF^$510.67^$459.50^$382.90^2^$357.40^4^^
    (S)^333-987M-88^DESC,OF,PROD,AND,STUFF^$608.77^$547.90^$456.50^2^$426.10^4^^
    

    说明

    正则表达式:

    \^               #            match '^' character
    ([^\^]+?)        # group 1  : match any char other than '^' one or more times, non-greedy
    (\(S\))?(\(N\))? # group 2-3: match "(S)" and/or "(N)" or none of them
    (\^.*)           # group 4  : match '^' and then everything
    

    替换:

    $2$3^$1$4        # concatenate group 2, then 3 and 1 and 4 after a '^' character
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2015-02-07
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多