我正在尝试编写一个正则表达式,它将匹配各种数字形式,有或没有各种语言的缩写,并返回数字(在行的开头)和文本的其余部分。例如,如果我有:
12,345 things
应该给我12,345
和things
其他形式可能包括:
12 things
12,345,456 things
它可以变得更复杂,K / M标记为数千/百万:
12.4k things
18.4m things
使用其他语言会更奇怪:
12,4 k things
2 345 things
有时,k
或m
可能会改为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.
的支持?
答案 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
附注:[]
内的字符内部会有或操作符,您不需要使用|
。