Regex 提取路径中的最后一次出现
我有一个路径,我需要提取3个字符的最后一个dirRegex 提取路径中的最后一次出现,regex,Regex,我有一个路径,我需要提取3个字符的最后一个dir aa-aaa/123/aaaa -> 123 aaa/123/abc -> abc aaa/1234/abcd -> aaa aaa -> aaa 这是我的 但我远不是一个有趣的结果,如果有人有一个好的正则表达式?如果你可以使用捕获组,这应该可以为你做到: .*(\b\w{3}\b) 它跳过所有(*)直到最后三个单词的字符序列(\b\w{3}\b),并将其捕获到组1中 \b确保单词边界,并且\w{3}是三个单词字符(
aa-aaa/123/aaaa -> 123
aaa/123/abc -> abc
aaa/1234/abcd -> aaa
aaa -> aaa
这是我的
但我远不是一个有趣的结果,如果有人有一个好的正则表达式?如果你可以使用捕获组,这应该可以为你做到:
.*(\b\w{3}\b)
它跳过所有(*
)直到最后三个单词的字符序列(\b\w{3}\b
),并将其捕获到组1中
\b
确保单词边界,并且\w{3}
是三个单词字符(即a-z
,a-z
加上0-9
)(与路径中允许的大多数字符相匹配。如果需要它来匹配所有,则必须更具体地描述执行环境
.如果您可以使用捕获组,这应该可以为您做到:
.*(\b\w{3}\b)
它跳过所有(*
)直到最后三个单词的字符序列(\b\w{3}\b
),并将其捕获到组1中
\b
确保单词边界,并且\w{3}
是三个单词字符(即a-z
,a-z
加上0-9
)(与路径中允许的大多数字符相匹配。如果需要它来匹配所有,则必须更具体地描述执行环境
.这一个完成了任务,您在组1中获得了目录名:
^(?:.+\/)*([^\/]{3})(?=\/|$)
说明:
^
(?: : non capture group
.+ : 1 or more any character
\/ : slash
)* : repeated 0 or more times
( : group 1
[^\/]{3}: 3 non slash
) : end group 1
(?= : look ahead
\/|$ : slash or end of line
) : end look ahead
这一个完成了任务,您在组1中获得了目录名:
^(?:.+\/)*([^\/]{3})(?=\/|$)
说明:
^
(?: : non capture group
.+ : 1 or more any character
\/ : slash
)* : repeated 0 or more times
( : group 1
[^\/]{3}: 3 non slash
) : end group 1
(?= : look ahead
\/|$ : slash or end of line
) : end look ahead
如果目录名中有非单词字符,则不起作用。@t查看注释(最后一行)在答案中。在我的例子中,这些是单词character,但为什么他不首先匹配?@emotte:在第一个例子中,你在第一个dir
aa-aaa
Yes中有一个破折号,但在匹配中,我只希望在目录名中有非单词字符时单词characterIt不起作用。@Toto查看注释(最后一行)在答案中。在我的例子中,这些是单词字符,但是为什么,他不首先匹配?@emotte:在你的第一个例子中,你在第一个dir中有一个破折号aa
是的,但是在匹配中我只想要单词字符注意,这需要lookaheads,并且//code>可能不需要根据你的regex风格进行转义。最坏的情况下,即使/
是免费转义的,也没关系。感谢您的解释!如果是多行输入,如示例所示,它可以在多行上匹配。这不太可能,但可以通过将换行符
添加到否定类中来避免。@casimirithippolyte可能会认为这会降低正则表达式的可维护性,但是是的,我不是想说答案不正确。注意这需要lookaheads,而且根据你的正则表达式的味道,/
可能不需要转义。在最坏的情况下,即使是免费转义,/
,也没关系。感谢你的解释!如果是多行输入,如示例所示,它可以与mul匹配有几行,。这不太可能,但可以通过向否定类添加换行符来避免。@casimirithippolyte有人可能会认为这会降低正则表达式的可维护性,但我不是说答案不正确