我一直在尝试增强一些确定字符串是否为有效百分比的代码。 我觉得是时候终于有了a hundred problems,并学习了正则表达式。 我一直在使用this网络正则表达式测试程序来构建我的模式。
我试图这样做相当松散,这样有效百分比可能是整数或小数,正数或负数,包括或不包括逗号,并且在开头和结尾以及可选的周围都有任意数量的空格负号和所需的百分号。
到目前为止,我有\s*-?\s*\d+(,\d+)*(?:\.\d*)?\s*%\s*
,它几乎可以正确匹配我的所有测试用例:
0
0
0
% 0
- 0 %
20948.924780%
315%
2,456,875 %
2,104.86%
89fqyf0gp948y1-%ghghpq98fy92,.?><
, , , ,,,, 0,0,000,00,00,,,0
, , , ,,,, 0,0,000,00,00,,,0%
000000000,00000000000 %
000000000,00000000000,00000000000 %
000000000,00000000000,00000000000,00000000000.00000000000 %
这些没有任何特定的顺序,有些通过而有些失败,但只有一个是不正确的。在, , , ,,,, 0,0,000,00,00,,,0%
中,最后一个0%\n
是匹配,但整行应该无效。开始和结束指标似乎没有我假设的效果,因为$
只进行最后一个示例匹配,而开头的^
没有匹配寄存器。
这可能是一些小事,但作为昨天才学习正则表达式的人,这远远超出了我的能力范围。
谢谢!
答案 0 :(得分:1)
开始和结束指标似乎没有我假设的效果,因为$只做最后一个示例匹配,而开头的^没有匹配寄存器。
那些anchors应该有效。但是,它确实依赖于正则表达式引擎和选项是否匹配行开始/结束或文件开始/结束。在RegExr上,您必须检查多行选项:http://regexr.com?380p9 - 在编程中,使用m
标志。
答案 1 :(得分:1)
可以这样做。
编辑:所以在实现了它的线条之后,现在这就是正则表达式。
注(s) -
使用多线模式线Bergi's
此外,您不能只使用\s
wihitespace类。
使用什么模式并不重要,如果可以,\s
将匹配CRLF,这意味着
-
000,000000.22
%
会匹配,因为它满足所有条件
[^\S\r\n]
表示匹配CRLF字符以外的空格。它可以用
替换
[^\S\n]
在现实世界中。该测试仪的初始输入使用\ r \ n换行符。
祝你好运!!
# ^[^\S\r\n]*-?[^\S\r\n]*(?:(?:\.\d+)|(?:\d+(?:,\d+)*(?:\.\d*)?))[^\S\r\n]*%[^\S\r\n]*$
^ # BOL
[^\S\r\n]*
-? # optional -
[^\S\r\n]*
(?: # group
(?: \. \d+ ) # .number
| # or
(?: # group
\d+ # number
(?: , \d+ )* # optional many ,number
(?: \. \d* )? # optional . optional number
) # end group
) # end group
[^\S\r\n]*
% # %
[^\S\r\n]*
$ # EOL