舍得英语魔法学苑

 找回密码
 注册
查看: 825|回复: 7

[其它] 分享正则表达式一次合并多行的万能公式

  [复制链接]
  • TA的每日心情
    郁闷
    16 小时前
  • 签到天数: 1819 天

    [LV.Master]伴坛终老

    qixiaobin0715 发表于 2019-10-20 10:32:40 | 显示全部楼层 |阅读模式
    本帖最后由 qixiaobin0715 于 2019-10-20 14:03 编辑

          进行课程制作时,经常会遇到源文本答案区由多行文本构成,处理文本时需要将答案区多行进行合并为一行,行间用<br>分隔,这样处理后在课程中还能显示源文本多行的效果。在学苑帖子里,看到大部分同仁采取统一表达式多次替换的方法进行处理,这样倒是一种处理手段,好麻烦,还不知道需要替换多少次,而实际上不同的源文本有较大的差异,使用表达式也不同,对于新手来说难度较大。于是我想能不能找到一种规律性较强的方法,对于不同的文本,能够很容易的只替换少量特征字符,就像数学公式那样,不就简单多了。经过很长时间的思考和摸索,反复验证和修改,取得了成功。现分享如下:
          当然应用时还是需要对正则表达式要有一定的了解。
          1.预处理:首先还是要分析问题区文本和答案区文本有何区别,按照它们之间区别将问题区文本行首行尾加上特殊字符进行标注。特殊字符最好是源文本中没有的字符,比如#、@、¤、♂等。
        2.应用万能公式进行替换。比如我们上一步添加的特殊字符是#,万用公式就是:
          查找:(?<!#)\n(?!#)
          替换为:<br>
        3.适当时候删除特殊字符。


        下面用实例来说明:
        示范文本如下

    1. superfluous   [su:5p\:flJEs]
    2. 【考法 1】  adj. 多余的,过剩的:  exceeding what is sufficient or necessary
    3. 【例】  a complicated algorithm that could filter all superfluous information  一个能滤除所有的多余信息的复杂算法
    4. 【近】  excessive, extra, redundant, surplus
    5. 【反】  deficient, inadequate, insufficient, scanty, scarce, short, skimpy, sparse  不足的
    6. 【派】  superfluity  n. 多余,过剩
    7. superimpose   [ˌsju:pərɪmˈpəʊz]
    8. 【考法 1】  v. 添声加色,使形象、某因素或性质更加清楚:to add as a distinct feature, element, or quality:
    9. 【例】  superimposed her own interpretation when she retold the story  她重复故事的时候,加入了自己的解释

    复制代码

    经过分析可知:问题区不含字符“】或【”,含有字符“]或[”。可根据这些特征给问题区加特征字符(这里使用#)
    查找:^[^】]+$
    或^.*\[.*$
    上面\[的写法是因为[是元字符需转义
    替换为:#\0#

    替换后文本变为:

    1. #superfluous   [su:5p\:flJEs]#
    2. 【考法 1】  adj. 多余的,过剩的:  exceeding what is sufficient or necessary
    3. 【例】  a complicated algorithm that could filter all superfluous information  一个能滤除所有的多余信息的复杂算法
    4. 【近】  excessive, extra, redundant, surplus
    5. 【反】  deficient, inadequate, insufficient, scanty, scarce, short, skimpy, sparse  不足的
    6. 【派】  superfluity  n. 多余,过剩
    7. #superimpose   [ˌsju:pərɪmˈpəʊz]#
    8. 【考法 1】  v. 添声加色,使形象、某因素或性质更加清楚:to add as a distinct feature, element, or quality:
    9. 【例】  superimposed her own interpretation when she retold the story  她重复故事的时候,加入了自己的解释

    复制代码

    应用公式
          查找:(?<!#)\n(?!#)
          替换为:<br>
    替换后文本变为:

    1. #superfluous   [su:5p\:flJEs]#
    2. 【考法 1】  adj. 多余的,过剩的:  exceeding what is sufficient or necessary<br>【例】  a complicated algorithm that could filter all superfluous information  一个能滤除所有的多余信息的复杂算法<br>【近】  excessive, extra, redundant, surplus<br>【反】  deficient, inadequate, insufficient, scanty, scarce, short, skimpy, sparse  不足的<br>【派】  superfluity  n. 多余,过剩
    3. #superimpose   [ˌsju:pərɪmˈpəʊz]#
    4. 【考法 1】  v. 添声加色,使形象、某因素或性质更加清楚:to add as a distinct feature, element, or quality:<br>【例】  superimposed her own interpretation when she retold the story  她重复故事的时候,加入了自己的解释<br><br>
    复制代码
    成功替换!!!


  • TA的每日心情
    开心
    2018-7-1 11:50
  • 签到天数: 69 天

    [LV.6]常住居民II

    舍得 发表于 2019-10-20 10:56:35 | 显示全部楼层
    我专程赶来帮你消灭零回复的。不谢。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    16 小时前
  • 签到天数: 1819 天

    [LV.Master]伴坛终老

     楼主| qixiaobin0715 发表于 2019-10-20 11:00:33 | 显示全部楼层
    舍得 发表于 2019-10-20 10:56
    我专程赶来帮你消灭零回复的。不谢。

    该谢还是要谢的!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    16 小时前
  • 签到天数: 1819 天

    [LV.Master]伴坛终老

     楼主| qixiaobin0715 发表于 2019-10-20 14:10:17 | 显示全部楼层
    实例中预处理替换,查找项“或“后面有问题,已更正。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    12 小时前
  • 签到天数: 46 天

    [LV.5]常住居民I

    苦瓜我来了 发表于 2019-10-21 17:09:26 | 显示全部楼层
    技术文章支持。。 慢慢看
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    16 小时前
  • 签到天数: 1819 天

    [LV.Master]伴坛终老

     楼主| qixiaobin0715 发表于 2019-10-24 12:50:46 | 显示全部楼层
    苦瓜我来了 发表于 2019-10-21 17:09
    技术文章支持。。 慢慢看

    知其然容易,知其所以然应当也不难!不用慢慢看吧,还能用超过五分钟时间吗?写的应当很明白了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    16 小时前
  • 签到天数: 1819 天

    [LV.Master]伴坛终老

     楼主| qixiaobin0715 发表于 2019-10-29 11:08:04 | 显示全部楼层
    本帖最后由 qixiaobin0715 于 2019-11-6 09:32 编辑

    匹配整行文本的正则表达式的规范写法。
    看到论坛或者其它网站上有不少匹配整行的正则表达式,但是写法大多都不规范(包括我自己不注意时也会出现此状况)。对于较小的文本处理起来问题不大,但如果处理较大的文本文件,效率就非常低,甚至发生死机的情况。在匹配整行文本时,为了提高正则引擎的效率,要注意以下三点:

    1.表达式最前面必须加上表示行首位置的元字符“^”。
    2.在表达式最后一个元素或子表示式中避免使用忽略优先的量词即类似“.*?或.+?”等的表达式。
    3.如果正则表达式最后一个元素是“.*”、“.+”,可以省略表示行尾位置的元字符“$”。

    举例如下,要求匹配以符号“#”开头的所有行:
    有人这么写表达式。
    ^#.*?$
    实际上面的表达式并无错误,只是这么写匹配起来效率太低。规范的写法应当是:
    ^#.*$
    甚至将$省略写成^#.*
    实际上顶楼上面的例子中表达式中的$均可省略。
    其原理讲起来较为麻烦,想要了解请参照我以前的帖子“正则表达式处理复杂文本思路”中的叙述。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    16 小时前
  • 签到天数: 1819 天

    [LV.Master]伴坛终老

     楼主| qixiaobin0715 发表于 2019-10-31 11:00:04 | 显示全部楼层
    本帖最后由 qixiaobin0715 于 2019-10-31 17:18 编辑

    关于楼上表达式^#.*能够匹配以#开头的整行文本的说明:
    有人可能会感到迷惑,上面的表达式的结尾并没有用$来表示要匹配到行尾,为什么能够匹配以#开头的整行文本呢?
    这与正则表达式的标准量词是匹配优先的特性有关,标准量词有:?、*、+、{min,max}四种形式。这里就说一说*的含义,其它标准量词的特性与此类似。
    *号与其前面的字符或子表达式组合表示匹配:下限为零,上限是尽可能多的前面的元素。如果不存在目标字符,并不表示匹配失败,因为下限为零,允许不匹配任何字符;如果存在目标字符,就会尽可能多的匹配直到不是目标字符为止。下面以实例来演示。
    示范文本如下

    1. #superfluous   [su:5p\:flJEs]#
    2. 【考法 1】  adj. 多余的,过剩的:  exceeding what is sufficient or necessary
    3. 【例】  a complicated algorithm that could filter all superfluous information  一个能滤除所有的多余信息的复杂算法
    4. 【近】  excessive, extra, redundant, surplus
    5. 【反】  deficient, inadequate, insufficient, scanty, scarce, short, skimpy, sparse  不足的
    6. 【派】  superfluity  n. 多余,过剩
    7. #superimpose
    8. 【考法 1】  v. 添声加色,使形象、某因素或性质更加清楚:to add as a distinct feature, element, or quality:
    9. 【例】  superimposed her own interpretation when she retold the story  她重复故事的时候,加入了自己的解释

    复制代码



    使用正则表达式^#.*进行匹配。第1、7行第一个字符#能够被表达式中的^#匹配,接下来表达式中的.*会对这两行后面的字符进行匹配。由于点号可以匹配任意字符(这里限制点号匹配换行符),*号是匹配优先的量词,就会尽可能多的匹配后面的字符,所以会一直匹配到换行符前的最后一个字符,正则引擎才会停止,即第1行匹配到行尾的#,第7行匹配到最后一个字母e。所以上面的表达式能够匹配整个第1、7行所有字符。这种情况下表达式后面就不需要再加行尾标志$。即使某一行只有一个字符#,也能匹配,因为.*允许不匹配任何字符。
    并不是所有的表达式都可以省略$。比如在示范文本中,我们要匹配以#开头,以字母e结尾的整行,$就不能省略。表达式应为:^#.*e$,第7行得到匹配。如果省略$,虽然第7行也能匹配,但是第1行的前面部分也符合条件(#supe),并得到匹配,这与我们的要求不符合,因为我们需要匹配符合要求的整行。前面我们说过省略$的条件,在这里并不符合。

    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    小黑屋|手机版|Archiver|官方微博|官方QQ群|舍得英语魔法学苑 ( 冀ICP备11024081号-1 )

    GMT+8, 2019-11-15 22:47 , Processed in 0.038362 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表