2014-06-17 34 views
0

分离。在我要匹配的第一样本的字符串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来测试正则表达式。

回答

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

0

Live demo

试试这个:

=(.*)\/(.*)\/(.*)|=(.*)\/(.*)|=(.*) 
0
=([^\/]+)\/?(.+)? 

的?使其成为可选。这将选择第一组之前/之前的所有内容。剩下的是可选的

如果你想匹配空值也可以用*改变+。

通用与支持/

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

任何金额就在两组查找值