正则表达式匹配一组可选的单个或一组字符

时间:2018-02-13 09:37:40

标签: regex

我正在尝试编写一个正则表达式,它将匹配各种数字形式,有或没有各种语言的缩写,并返回数字(在行的开头)和文本的其余部分。例如,如果我有:

12,345 things应该给我12,345things

其他形式可能包括:

12 things
12,345,456 things

它可以变得更复杂,K / M标记为数千/百万:

12.4k things
18.4m things

使用其他语言会更奇怪:

12,4 k things
2 345 things

有时,km可能会改为Tsd.Mio.,例如:

12,4 Tsd. things
18.3 Mio. things

在这些情况中的每一种情况下,我希望匹配数字(如果它引出行)和匹配时首先出现的单位(k或{例如{1}}。

到目前为止我所拥有的是:

Tsd.

这将正确匹配包含/^(\d+(?:[,|\s|.]\d+)*\s?[K|k|M|m]?)\s+(.*)/Tsd.之外的所有表单。但我无法找到在交替字符集中使用字符组的方法。如何为此正则表达式添加对Mio.Tsd.的支持?

3 个答案:

答案 0 :(得分:1)

您必须使用组而不是一组字符:

/^(\d+(?:[,|\s|.]\d+)*\s?(K|k|M|m|Tsd\.|Mio\.)?)\s+things$/

您使用的括号描述了一组字符,只是放入Tsd。在那里意味着T,s,d或。使用圆括号中的组可以获得所需的结果。

最后要小心。*,因为这样你就可以得到你之前在12,4 Tsd上使用的正则表达式的匹配。东西和18.3 Mio.事情,因为单位是可选的。*匹配包括Tsd在内的所有内容。和Mio。

答案 1 :(得分:1)

[K|k|M|m]添加另一个案例 - 部分:

^(\d+(?:[,|\s|.]\d+)*\s?([KkMm]?|Tsd\.|Mio\.))\s+(.*)

我在此处添加了括号并添加了两个新案例。使用regex101进行测试时,所有给定的测试用例仍然有用。

答案 2 :(得分:1)

我建议你使用这样的正则表达式:

/^((\d[,\s.]?)+(mio\.|tsd\.|k|m)?)\s+(.+)$/gi

附注:[]内的字符内部会有操作符,您不需要使用|