V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jmyz0455
V2EX  ›  程序员

有没有一句通用的正则表达式,能匹配某两个任意字符之间的所有内容但不包含该字符?

  •  
  •   jmyz0455 · 2017-04-12 12:33:18 +08:00 · 10870 次点击
    这是一个创建于 2764 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不了解正则,这个问题在网上可以搜到很多答案,但是答案之间差异很大,好像各种编程语言实现的方式都不一样?难道正则表达式在不同编程语言里会有差异?学着正则的教程弄了半天,总是会把一头一尾两个字符给匹配到,请问有没有以下一句正则表达式:

    1. 能匹配某两个任意字符之间的所有内容但不包含该字符?
    2. 在任何编程语言都通用,实现方法可以不同。
    3. 尽量多匹配。
    4. 所有内容可以不包含换行符。
    5. 如果把任意字符换成任意多个字符呢?例如 ([{'要匹配的内容"/\>([{'要匹配的内容"/\>([{'要匹配的内容"/\> ,如何让编程语言通过一条正则表达式返回类似 “要匹配的内容要匹配的内容要匹配的内容” 的字符串呢?

    谢谢。

    17 条回复    2017-04-13 20:25:32 +08:00
    torbrowserbridge
        1
    torbrowserbridge  
       2017-04-12 13:02:09 +08:00
    /(?<=X).*(?=Y)/
    ghostheaven
        2
    ghostheaven  
       2017-04-12 13:02:10 +08:00 via Android
    两个任意字符是给定的吗?需要匹配多次吗?需要匹配 ABxxAByyyAB 里面的 xx 和 yyy 吗?
    knightdf
        3
    knightdf  
       2017-04-12 13:08:08 +08:00
    (?<=x)(.+)(?=y)
    lilydjwg
        4
    lilydjwg  
       2017-04-12 13:11:48 +08:00
    > 难道正则表达式在不同编程语言里会有差异

    是的。不同的正则引擎实现是有差异的。小的话只是语法不一样,大的话功能特性效率都会大有差别。
    hitmanx
        5
    hitmanx  
       2017-04-12 13:21:23 +08:00
    可能要注意 greedy vs lazy, http://www.regular-expressions.info/repeat.html
    jmyz0455
        6
    jmyz0455  
    OP
       2017-04-12 13:51:28 +08:00
    @ghostheaven 给定,需要,最后一句不清楚,我问题里面的例子有不清楚的地方吗?
    jmyz0455
        7
    jmyz0455  
    OP
       2017-04-12 13:52:24 +08:00
    @lilydjwg 哦,原来是这样,我主要用 Python 和 Javascript ,做笔记时要好好区分下了。
    jmyz0455
        8
    jmyz0455  
    OP
       2017-04-12 13:53:38 +08:00
    @hitmanx 嗯,我应该是要 greedy 的。
    Firw
        9
    Firw  
       2017-04-12 15:48:56 +08:00 via iPad
    Python 为例:

    >>> import re
    >>> pattern = r'''(?<=\(\[\{').+?(?="/\\>)'''
    >>> string = '''([{'aabbcc"/\>([{'aabbcc"/\>([{'aabbcc"/\>'''
    >>> re.findall(pattern, string)
    输出:
    ['aabbcc', 'aabbcc', 'aabbcc']

    获取到内容后,剩下的可以自由发挥了。
    lrxiao
        10
    lrxiao  
       2017-04-12 19:35:09 +08:00   ❤️ 1
    有些语言没有逆序环视的..
    imn1
        11
    imn1  
       2017-04-12 19:55:29 +08:00
    单个字符: a([^ab]+)b
    字符串:
    本站搜索 正则 排除,带上我的 nick 搜,回复过很多次了
    owt5008137
        12
    owt5008137  
       2017-04-12 20:24:58 +08:00 via Android
    单字符: a([^a]+)*a
    多字符好像没有跨语言的方法。有些语言 /库的正则可以排除,那得看文档了
    tomato3
        13
    tomato3  
       2017-04-12 23:36:51 +08:00
    我感觉第三条 尽量多匹配会导致你出错, greedy 。
    正则前段为匹配开始, 中间要排除非尾巴的字符并且列为元组 ,如果中间是 greedy 的话,会尽可能多的匹配,直到最后一个匹配项的结束,就是你每次都匹配到结尾而且只有一个的原因,如果是 lazy 的话,会只匹配最低限度。
    我没有用到过一句正则执行就返回一个你所说的字符串的,难道不是应该用匹配对象中的匹配值进行拼接吗?就是拼接中间的匹配到的元组。
    ghostheaven
        14
    ghostheaven  
       2017-04-13 00:04:25 +08:00 via Android
    @jmyz0455 感觉你需要的不是匹配中间的东西,而是剔除给定的字符。
    ivvei
        15
    ivvei  
       2017-04-13 00:10:42 +08:00
    通用的是没有的。各语言的正则实现都不一样,连通配符都可能不一样,没法通用。
    xiaoyu233
        16
    xiaoyu233  
       2017-04-13 01:28:57 +08:00 via iPhone
    Xxx(.*?)xxX
    lonenol
        17
    lonenol  
       2017-04-13 20:25:32 +08:00
    匹配两个字符之间的任意字符...那怎么判断开始和结束的字符呢..
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3361 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:48 · PVG 18:48 · LAX 02:48 · JFK 05:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.