Я думаю, вы можете искать что-то вроде этого:
^([a-zA-Z]+(?: *- *[a-zA-Z]+(?: +[a-zA-Z]+)*)?)(?: +(\d+(?:\/\d+)?))?$
Пояснение:
^ Start of line
( First capturing group (for the words)
[a-zA-Z]+ A word
(?:...)? (Omitted for clarity)
) Close first group
(?: Start non-capturing group
\s+ Some whitespace
( Second capturing group (for the numbers)
\d+ A number
(?:\/\d+)? Optionally a slash followed by another number
) Close capturing group
)? Close optional non-capturing group
$ End of line
Я опустил объяснение этой части выше: (?: *- *[a-zA-Z]+(?: +[a-zA-Z]+)*)?
. Он соответствует тире, за которым следуют одно или несколько слов, разделенных пробелом. Я также написал \s
в объяснении вместо
, потому что пространство невидимо. Но \s
соответствует любому пробелу, включая новые строки. Вы можете предпочесть совпадение только с пробелами.
Rubular