尝试匹配/../之前但正/表达式之后的匹配

时间:2010-04-13 06:36:41

标签: regex

我正在尝试将/../之前的内容与/之后的正则表达式进行匹配,但我希望它回顾并停留在第一个/

我觉得我很接近,但它只是看第一个斜线,然后把它后面的所有内容都像...输入就是这样:

this/is/a/./path/that/../includes/face/./stuff/../hat

我的正则表达式是:

#\/(.*)\.\.\/#

匹配/is/a/./path/that/../includes/face/./stuff/../而非that/../stuff/../

我应该如何更改正则表达式以使其正常工作?

7 个答案:

答案 0 :(得分:2)

.*表示“匹配任意数量的任何字符[1]”。这不是你想要的。您希望匹配任意数量的非 - / 字符,这些字符写为[^/]*

如果您想在正则表达式中使用.*.+,请非常怀疑。停下来问问自己,你是否真的 意味着“任何角色”[1]或不是 - 大部分时间你都没有。 (并且,是的,非贪婪的量词可以帮助解决这个问题,但是角色类对于正则表达式引擎来说更有效率,并且在他们与人类读者的意图沟通方面更加清晰。)

[1]好的,好的...... .并不完全是“任何字符” - 默认情况下,它与大多数正则表达式中的换行符(\n)不匹配 - 但是关闭够了。

答案 1 :(得分:1)

更改只有/[^/])以外的字符匹配的模式:

#([^/]*)/\.\./#

答案 2 :(得分:1)

或者,您可以使用lookahead

#(\w+)(?=/\.\./)#

解释

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    /                        '/'
--------------------------------------------------------------------------------
    \.                       '.'
--------------------------------------------------------------------------------
    \.                       '.'
--------------------------------------------------------------------------------
    /                        '/'
--------------------------------------------------------------------------------
  )                        end of look-ahead

答案 3 :(得分:0)

我认为你基本上是对的,你只需要让比赛变得非贪婪,或者将(.*)更改为不允许斜杠:#/([^/]*)/\.\./#

答案 4 :(得分:0)

用你最喜欢的语言,做一些分裂和字符串操作,例如Python

>>> s="this/is/a/./path/that/../includes/face/./stuff/../hat"
>>> a=s.split("/../")[:-1]  # the last item is not required.
>>> for item in a:
...   print item.split("/")[-1]
...
that
stuff

答案 5 :(得分:0)

在python中:

>>> test = 'this/is/a/./path/that/../includes/face/./stuff/../hat'
>>> regex = re.compile(r'/\w+?/\.\./')
>>> regex.findall(me)
['/that/..', '/stuff/..']

或者如果你只想要没有斜杠的文本:

>>> regex = re.compile(r'/(\w+?)/\.\./')
>>> regex.findall(me)
['that', 'stuff']

答案 6 :(得分:0)

([^/]+)将捕获斜杠之间的所有文字。

([^/]+)*/\.\.that\..字符串中匹配stuff\..this/is/a/./path/that/../includes/face/./stuff/../hat它会捕获thatstuff,您可以更改它,显然,通过更改捕获parens和程序逻辑的位置。

您没有说明是否要捕获或只是匹配。这里的正则表达式只捕获匹配(stuff)的最后一次出现,但如果在全局匹配中使用global,则很容易更改为返回that然后stuff

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (                        group and capture to \1 (0 or more times
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    [^/]+                    any character except: '/' (1 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )*                       end of \1 (NOTE: because you're using a
                           quantifier on this capture, only the LAST
                           repetition of the captured pattern will be
                           stored in \1)
--------------------------------------------------------------------------------
  /                        '/'
--------------------------------------------------------------------------------
  \.                       '.'
--------------------------------------------------------------------------------
  \.                       '.'