我正在尝试将/../
之前的内容与/
之后的正则表达式进行匹配,但我希望它回顾并停留在第一个/
我觉得我很接近,但它只是看第一个斜线,然后把它后面的所有内容都像...输入就是这样:
this/is/a/./path/that/../includes/face/./stuff/../hat
我的正则表达式是:
#\/(.*)\.\.\/#
匹配/is/a/./path/that/../includes/face/./stuff/../
而非that/../
和stuff/../
我应该如何更改正则表达式以使其正常工作?
答案 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
它会捕获that
或stuff
,您可以更改它,显然,通过更改捕获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)
--------------------------------------------------------------------------------
/ '/'
--------------------------------------------------------------------------------
\. '.'
--------------------------------------------------------------------------------
\. '.'