Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 增加除一个或多个(用逗号分隔)外的所有数字,前提是前面的字符串(用于图书索引)_Regex_Perl - Fatal编程技术网

Regex 增加除一个或多个(用逗号分隔)外的所有数字,前提是前面的字符串(用于图书索引)

Regex 增加除一个或多个(用逗号分隔)外的所有数字,前提是前面的字符串(用于图书索引),regex,perl,Regex,Perl,我正在尝试将包含以下内容的文件中的每个页码增加一个固定数量(它是一本书的索引): 亚当和伊娃42-44(Abb.14、15) 梵蒂冈使徒图书馆。第1613 31组(Abb.8) 汉堡,Staatsbibliothek,斯克林151女士。35(Abb.11) 转复器。特里萨·冯·奥维拉10,18(神甫第2章,细节第8节) 该文件包含年数、数字等。但是,页码 前面从不加“Abb”或“Ms” 有3个或更少的数字 我想将数字4添加到页码中,理想情况下会导致 亚当和伊娃46-48(Abb.14、15)

我正在尝试将包含以下内容的文件中的每个页码增加一个固定数量(它是一本书的索引):

亚当和伊娃42-44(Abb.14、15)

梵蒂冈使徒图书馆。第1613 31组(Abb.8)

汉堡,Staatsbibliothek,斯克林151女士。35(Abb.11)

转复器。特里萨·冯·奥维拉10,18(神甫第2章,细节第8节)

该文件包含年数、数字等。但是,页码

  • 前面从不加“Abb”或“Ms”
  • 有3个或更少的数字
我想将数字4添加到页码中,理想情况下会导致

亚当和伊娃46-48(Abb.14、15)

梵蒂冈使徒图书馆。第1613 35组(Abb.8)

汉堡,Staatsbibliothek,斯克林151女士。39(Abb.11)

转复器。特里萨·冯·奥维拉14、22(神甫第2章,细节第12节)

一个口头规则可以是:如果每个数字有3位数或更少,并且前面没有“Abb.| Ms.”或另一个以“,”分隔的数字,并且依次前面有“Abb.| Ms.”,则在每个数字上加4

下一行

perl -pe 's/(?<!Abb. )(\b\d{1,3}\b)/$1+4/eg' original.md
仍然存在两个问题,其中第一个问题最为紧迫:

  • 第1行的第二位数当然增加了4。但我不知道如何解决这个问题。我知道我可以将中间部分扩展为类似
    (\b\d{1,3}\b),?\s?(\b\d{1,3}\b)?
    的内容,并使用
    $2
    引用第二个数字,但我不知道如何处理替换中的分隔逗号(如果存在)
  • “Ms.”之后的数字增加了4。但是,如果我将负lookback更改为
    (?),我将收到未在regex m/(?)中实现的错误
    可变长度lookback,我不知道这种实现的替代方法

  • 非常感谢您对这两个问题的任何帮助!

    您可以使用以下正则表达式:

    此正则表达式的工作方式如下:

    • (?:Abb | Ms)
      按字面意思匹配
      Abb
      Ms
    • \。\s+
      匹配文本
      字符,后跟一个或多个空白字符
    • \d{1,3}
      1和3位数字之间的匹配
    • (?:,\s+\d{1,3}\b)*
      匹配以下非捕获组任意次数:
      • ,\s+\d{1,3}\b
        匹配
        ,后跟一个或多个空格字符,然后是1到3个数字,并使用字边界断言数字的结尾
    • (*SKIP)
      控制动词,如果正则表达式试图回溯其位置,则会导致其放弃当前匹配(这意味着它确实匹配了此字符串,并将阻止第二个选项匹配)
    • (*FAIL)
      控制动词,强制此匹配失败,导致从结果中排除当前匹配
    第二个选项是实际匹配的内容:
    \b\d{1,3}\b
    -在1到3个数字之间进行匹配,将每一个边作为单词边界



    如果
    \b
    没有正确匹配每个位置,您可能需要将
    \b
    替换为
    (?:(?要修复2,您需要创建第二个负查找:
    (?您是否试图将第4行的
    8
    增加到
    12
    ?@ctwheels谢谢!关于您的第二个问题:是的,这是有意的。太棒了,非常感谢!我忘了提到一个示例条目,例如
    Bacchus 44A
    ,其计算结果应为
    Bacchus 48A
    。我可以将第二个选项修改为
    >(?@Turtle)您可以很容易地使用
    \b(\d{1,3})(?=A |\b)
    或我提供的第二个示例。我的问题不是指正则表达式,而是指s///命令的替换部分。但它似乎与
    s/regex/($1+4)一起工作。$2/eg
    Adam und Eva 46--48 (Abb. 14, 19)
    Biblioteca Apostolica Vaticana Cod. gr. 1613 35 35 (Abb. 8)
    Hamburg, Staatsbibliothek Ms. 155 in scrin. 39 (Abb. 11)
    Transverberation der Hl. Theresa von Ávila 14, 22 (Abb. 2, Detail S. 12)
    
    (?:Abb|Ms)\.\s+\d{1,3}(?:,\s+\d{1,3}\b)*(*SKIP)(*FAIL)|\b\d{1,3}\b
    
    (?:Abb|Ms)\.\s+\d{1,3}(?:,\s+\d{1,3}(?=\D|$))*(*SKIP)(*FAIL)|(?:(?<=\D)|^)\d{1,3}(?=\D|$)