查看: 295|回复: 3
打印 上一主题 下一主题

[求助] 请教一个正则表达式问题

[复制链接]
  • TA的每日心情
    擦汗
    2020-7-3 13:51
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    90

    主题

    277

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    10032
    跳转到指定楼层
    1
    发表于 2021-3-31 12:12:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    一个小软件让用户输入一个文本文件,其中含很多关键词和页码数字。现在需要将整个文本文件内容看成一个字符串进行正则处理识别出一个个关键词和页码。
    页码和关键词出现的顺序以及数量, 文本文件中每行有几个关键词或页码,每行是关键词开头还是页码开头 —— 等等这一切都无限制。
    页码和关键词之间的间隔符为A,关键词和关键词之间的间隔符为B。
    A,B这两个字符串并非固定值,事先不知道,是由用户在软件的界面中输入的。

    对A,B两个间隔符字符串的要求:
    (1)A和B都是合法的正则表达式
    (2)A和B都要能匹配换行符\n
    (3)除以上(1),(2)外,对A和B再无其他任何限制。如:A和B可以相等也可以不相等;某个间隔符可以同时匹配A和B(即符合A条件的间隔符集合可以与符合B条件的间隔符集合有交集);A和B不一定必须是或者包含空白字符;A和B可以是单个字符也可以是多个字符;A和B甚至可以匹配上关键词或其子字符串,只要A和B可以有效非歧义地间隔这些关键词和页码。
    举例:
    \t|\n|aaa 有可能是一个合法关键词间隔符字符串,它表示制表符\t,换行符\n和连续的三个字母aaa都可以作为分隔符,只要关键词中不含制表符,换行符和连续的三个字母aa

    对关键词的要求:
    关键词和页码相邻时,A不允许匹配关键词和页码(但允许B匹配关键词和页码)
    关键词和关键词相邻时,B不允许匹配这两个关键词(但允许A匹配这两个关键词)
    关键词不包含回车换行\r和\n,除此之外无其他限制,例如可以包含一个或多个制表符\t+,一个或多个空格

    总之,我的意思就是对间隔符唯一的要求是它可以有效将页码数字和关键词间隔开,且默认换行永远是间隔符。

    C#中有一个Regex.Split方法,可以接受一个正则表达式作为间隔符将一个字符串分成众多子字符串,这个方法貌似可以解决以上问题,但我的要求是关键词中有可能合法含有间隔符,如关键词和关键词相邻时,B不允许匹配这两个关键词,但允许A匹配这两个关键词。Regex.Split方法分开的子字符串中是不允许含有这些间隔符的。

    可能我的问题本身就是非法的所以不可能有解答,那么可以再收紧用户输入关键词以及A,B的要求。
  • TA的每日心情
    开心
    2018-8-8 03:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    254

    主题

    4264

    回帖

    7万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    79050

    小蜜蜂章笑傲江湖章灌水大神章QQ 章

    QQ
    2
    发表于 2021-3-31 19:35:31 | 只看该作者
  • TA的每日心情
    擦汗
    2020-7-3 13:51
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    90

    主题

    277

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    10032
    3
     楼主| 发表于 2021-3-31 20:03:07 | 只看该作者
    喬治兄 发表于 2021-3-31 19:35
    starmars 兄:
    試試 Regulex
    https://www.pdawiki.com/forum/forum.php?mod=viewthread&tid=40730&extra= ...

    大师兄推荐的这个正则测试工具没我这个好:

    http://regexhero.net/

    我推荐的这个既可以在线测试也可以下载软件线下自己测试。更重要的是,它用的是.NET的C#正则库制作的,可以说这个世界上最强大的正则实现库是微软的.NET,其他语言的实现,JavaScript,Python,Perl,Java,PHP统统没有C#的强大。

    随便举一个例子,JavaScript不支持逆序环视(零宽度断言),其他语言虽支持逆序环视,但对逆序环视中的表达式能匹配的文本长度有限制:Python只支持匹配固定长度文本的表达式,而Java和PHP只支持匹配有限长度文本的表达式,而伟大的.NET则无任何限制! 再举一例:小括号括起来的分组如果后面有* +这种量词,如果这个分组匹配上了很多次,只有.NET可以将这一个分组所有这些匹配全部轻易捕获到,而且他语言可能只能引用最后一个。
  • TA的每日心情
    开心
    2018-8-8 03:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    254

    主题

    4264

    回帖

    7万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    79050

    小蜜蜂章笑傲江湖章灌水大神章QQ 章

    QQ
    4
    发表于 2021-3-31 20:09:35 | 只看该作者
    starmars 发表于 2021-3-31 20:03
    大师兄推荐的这个正则测试工具没我这个好:

    http://regexhero.net/

    Starmars 兄,謝謝您的推鑑,正則我真不行.....只知道這個 Regulex 淺顯一點, 較為直觀容易看的懂些