匹配由斜杠分隔的字符串

时间:2014-06-17 21:22:03

标签: regex

在第一个示例中,我想匹配Mortal

输入1:

=Mortal

正则表达式1:

=(.+)

输出1:

MATCH 1
1.  [1-7]   `Mortal`

正如我想的那样工作。

在第二个示例中,我想匹配MortalCombat

输入2:

=Mortal/Combat

正则表达式2:

=(.+)\/(.+)

输出2:

MATCH 1
1.  [1-7]   `Mortal`
2.  [8-14]  `Combat`

正如我想的那样工作。

我的问题是,我想要一个兼具两者的解决方案。

如果我在=(.+)\/(.+)上使用=Mortal,则匹配

如果我在=(.+)上使用=Mortal/Combat,则匹配:

MATCH 1
1.  [1-14]  `Mortal/Combat`

两者都不正确。

试图将它们合并在一起:

=((.+)\/(.+)|(.+))

匹配:

MATCH 1
1.  [1-14]  `Mortal/Combat`
2.  [1-7]   `Mortal`
3.  [8-14]  `Combat`

或者:

MATCH 1
1.  [1-7]   `Mortal`
4.  [1-7]   `Mortal`

绝对不正确。

所需的输出应为:

MATCH 1
1.  [1-7]   `Mortal`

或者:

MATCH 1
1.  [1-7]   `Mortal`
2.  [8-14]  `Combat`
如果它与三个斜杠兼容,那么

也会很酷=Mortal/Combat/X应该变为:

MATCH 1
1.  [0-6]   `Mortal`
2.  [7-13]  `Combat`
3.  [14-15] `X`

我怎样才能做到这一点?

我正在使用http://regex101.com来测试正则表达式。

3 个答案:

答案 0 :(得分:1)

这适用于所有三种情况:

^=(.+)\/(.+)\/(.+)|=(.+)\/(.+)|=(.+)$

说明:

^                 # Assert position at the beginning of the line
=(.+)\/(.+)\/(.+) # Three slashes
|                 # OR
=(.+)\/(.+)       # Two slashes
|                 # OR
=(.+)             # No slashes
$                 # Assert position at the end of the line

Demo

答案 1 :(得分:0)

Live demo

试试这个:

=(.*)\/(.*)\/(.*)|=(.*)\/(.*)|=(.*)

答案 2 :(得分:0)

=([^\/]+)\/?(.+)?

?使它成为可选的。这选择了/为第一组之前的所有内容。其余的是可选的

如果你想匹配空值,可以用+更改+。

通用,支持任意数量的

=(([^\/]+)\/?)*

只需在第二组中查看值

即可