gpt4 book ai didi

regex - 在一行中某个符号出现第 n 次后匹配数字

转载 作者:行者123 更新时间:2023-12-04 10:54:05 24 4
gpt4 key购买 nike

我不确定使用正则表达式是否是解决此问题的正确方法,但我想先尝试使用正则表达式解决此问题(如果可能)

我有一个 edifact 文件,其中某些段中某些字段中的数据(以粗体显示)需要替换(具有不同的日期,相同的格式)

UNA:+,? '  
UNB+UNOC:3+000000000+000000000+20190801:1115+00001+DDMP190001'
UNH+00001+BRKE:01+00+0'
INV+ED Format 1+Brustkrebs+19880117+E000000001+**20080702**+++1+0'
FAL+087897044+0000000++name+000000000+0+**20080702**++1+++J+N+N+N+N+N+++0'
INL+181095200+385762115+++0'
BEE+20080702++++0'
BAA+++J+J++++++J+++++++J++0'
BBA++++++++J++++++J+J++++++J+++++J+++J+J++++++++J+0'
BHP+J+++++J+++++J+++++0'
BLA+++J+++++++++0'
BFA++++++++++++J++0'
BSA++J+++J+J+++0'
BAT+20190801+0'
DAT+**20080702**++++0'
UNT+000014+00001'
UNZ+00001+00001'

起初,我能够使用正向前瞻和后视(我有不同的表达式来匹配每个日期)来匹配这些字段。

例如,这里是我最初用来匹配“FAL”段中的日期的表达式: (?<=\+[\d]{1}\+)\d{8}(?=\+\+) ,但后来我看到这个日期有时前面是 9 位数字,有时前面是 1(基于版本),然后是++ 或 + 和一个日期,所以我添加了一个逻辑 OR,如下所示: (?<=\+[\d]{9}\+|\+[\d]{1}\+)\d{8}(?=\+[\d]{8}\+|\+\+)并很快意识到这是不可持续的,因为我看到这些 edifact 文件各不相同(远不止 9 位和 1 位数字)

(我每种类型有 6 个版本,我总共有 6 个类型)

因为我有一个方案/ map 指示每个版本应该构建什么样的并且我知道日期写在每个版本中的位置(基于 + 分隔符),我想可能会根据 + 匹配日期,所以在某一行中加号的第 7 次出现(例如在 FAL 段中),匹配接下来的 8 位数字。

这可以用正则表达式实现吗?如果是的话,有人可以告诉我怎么做吗?

最佳答案

我建议使用像这样的模式

^((?:[^+\n]*\+){7})\d{8}(?=\+(?:\d{8})?\+)

哪里 {7}可以调整为每种类型段所需的值,并替换为对 Group 1 的反向引用。在 Python 中,它是 \g<1>20200101 (其中 20200101 是您的新日期),在 PHP/.NET 中,它是 ${1}20200101 .在 JS 中,它将只是 $1 .

要在多行文本上运行,请使用 m旗帜。在 Python 正则表达式中,你可以像 (?m)^((?:[^+\n]*\+){7})\d{8}(?=\+(?:\d{8})?\+) 一样嵌入它.

Python regex demo

详情
  • ^ - 字符串/行的开头
  • ((?:[^+\n]*\+){7}) - 第 1 组:除 + 之外的任何字符的 7 次重复和换行符,然后是 +
  • \d{8} - 8 位数字
  • (?=\+(?:\d{8})?\+) - 后面跟着 + , 以及可选的 8 位数字块和 + .
  • 关于regex - 在一行中某个符号出现第 n 次后匹配数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59319408/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com