如何匹配由分隔符分隔的重复单词

时间:2014-04-08 13:17:43

标签: regex

我想创建接受这些值的regexp:

number:number [P][K]或者两者都没有,现在它可以用分隔符[ + ]再次重复它,所以例如有效值是:

15:15
1:0
1:2 K
1:3 P
1:4 P K
3:4 + 3:2
34:14 P K + 3:1 P

我创造的是:

([0-9]+:[0-9]+( [K])?( [P])?( [+] )?)+

这个例子只有一个错误。它接受值:

15:15 K P +  

不应该被允许。

我应该如何改变它?

更新:

我忘了提及它可以是K P或P K.或者值是有效的

1:4 K P

4 个答案:

答案 0 :(得分:0)

试试这个正则表达式:

^([0-9]+:[0-9]+(?: P)?(?: K)?(?: \+ [0-9]+:[0-9]+(?: P)?(?: K)?)*)$

Online tryout

更新:根据您的评论,您可以使用此评论,反之亦然,但它也会匹配P PK K

^([0-9]+:[0-9]+(?: [KP]){0,2}(?: \+ [0-9]+:[0-9]+(?: [KP]){0,2})*)$

答案 1 :(得分:0)

此正则表达式支持K和P的任何顺序:

^[0-9]+:[0-9]+( P| K| K P| P K)?( \+ [0-9]+:[0-9]+( P| K| K P| P K)?)*$

答案 2 :(得分:0)

怎么样:

^(\d+:\d+(?:(?: P)?(?: K)?|(?: P)?(?: K)?)?)(?:\s\+\s(?1))?$

说明:

^               : start of string
(               : start capture group 1
    \d+:\d+     : digits followed by colon followed by digits
    (?:         : non capture group
    (?: P)?     : P in a non capture group optional
    (?: K)?     : K in a non capture group optional
    |           : OR
    (?: K)?     : K in a non capture group optional
    (?: P)?     : P in a non capture group optional
    )?          : optional
)               : end of group 1
(?:             : non capture group
    \s\+\s      : space plus space
    (?1)        : same regex than group 1
)?              : end of non capture group optional
$               : end of string

答案 3 :(得分:0)

您可以使用此模式:

^(?:[0-9]+:[0-9]+(?:( [KP])(?!\1)){0,2}(?: \+ |$))+$

模式细节:

^
(?:                    # this group describes one item with the optional +
    [0-9]+:[0-9]+
    (?:                # describes the KP part
        ( [KP])(?!\1)  # capture current KP and checks it not followed by itself
    ){0,2}             # repeat zero, one or two times
    (?: \+ |$)         # the item ends with + or the end of the string
)+$                    # repeat the item group
Java风格的

^(?:[0-9]+:[0-9]+(?:( [KP])(?!\\1)){0,2}(?: \\+ |$))+$