V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ikaros
V2EX  ›  正则表达式

不用零宽断言如何实现匹配 @ 功能

  •  
  •   ikaros · 2016-07-06 18:09:55 +08:00 · 2030 次点击
    这是一个创建于 3065 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不知道标题说清楚没,就是说需要实现 @功能,但不能使用零宽断言, 需要匹配的文本格式其实比较严谨,比如 Hi @ikaros , nice to meet you! 需要匹配的用户名前面有个 @,后面有个空格. 当前的做法是 @(\\w+?)( ) 然后把 @和空格 trim 掉

    PS: 这个蛋疼的需求是因为某语言的正则表达式包似乎没有实现完整的正则支持.

    9 条回复    2016-07-07 10:24:04 +08:00
    shyling
        1
    shyling  
       2016-07-06 18:22:56 +08:00 via iPad
    > /@(\w+) /.exec('Hi @ikaros , nice to meet you!')
    [ '@ikaros ',
    'ikaros',
    index: 3,
    input: 'Hi @ikaros , nice to meet you!' ]
    判断[1]
    ikaros
        2
    ikaros  
    OP
       2016-07-06 21:04:05 +08:00
    @shyling 我写的和你一样的啊 - - ? 我只能匹配到一个 @ikaros
    shyling
        3
    shyling  
       2016-07-07 00:39:47 +08:00
    @ikaros 带上 global ,然后多执行几次。。直到返回 null(当然我在说 js
    shimanooo
        4
    shimanooo  
       2016-07-07 00:50:59 +08:00
    for 循环到 @,从后面一个位置开始搜索, 加上^
    Hello1995
        5
    Hello1995  
       2016-07-07 01:22:18 +08:00 via Android
    不是很懂正则表达式,但是如果是我,我可能会选择使用 “@(\w+?)\s ” ,大概。(我是说 PHP )
    UnisandK
        6
    UnisandK  
       2016-07-07 01:36:58 +08:00
    不支持断言就用程序逻辑来去掉头尾这不挺好的。。
    ikaros
        7
    ikaros  
    OP
       2016-07-07 09:09:38 +08:00
    @shyling 其实还有可能有多个 @的情况,所以这个方法感觉不太好

    @shimanooo
    @UnisandK 性能比较低吧,这样


    @Hello1995 一样的啊
    ikaros
        8
    ikaros  
    OP
       2016-07-07 09:11:50 +08:00
    @UnisandK 多了两次额外的函数调用和字符串复制 /传递,虽然正向预搜索应该也可能会额外增加时间
    shyling
        9
    shyling  
       2016-07-07 10:24:04 +08:00 via Android
    @ikaros 我已经说了多个的情况
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5367 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 09:21 · PVG 17:21 · LAX 01:21 · JFK 04:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.