Java 对字符串进行双重分析
这个问题是问题的继续。问题是regexJava 对字符串进行双重分析,java,regex,string,parsing,double,Java,Regex,String,Parsing,Double,这个问题是问题的继续。问题是regex“[-+]?\\d*\\.?\\d+([eE][-+]?\\d+)”无法正确查找双精度 例如,inputsdf9.99e.23不包含双精度,因为如果有[eE],后面必须是[+-]或仅仅是[0-9] 所以我需要一些正则表达式中的“如果”。在伪代码中是这样的:if(char[i]=(e | e)),然后if(char[i+1]=('+'|'-'))else返回null使用心灵感应(预期)扩展算法,并禁止数字、点、非数字作为数字,我可以建议这3个正则表达式。在同一
“[-+]?\\d*\\.?\\d+([eE][-+]?\\d+)”
无法正确查找双精度
例如,inputsdf9.99e.23
不包含双精度,因为如果有[eE],后面必须是[+-]或仅仅是[0-9]
所以我需要一些正则表达式中的“如果”。在伪代码中是这样的:if(char[i]=(e | e)),然后if(char[i+1]=('+'|'-'))else返回null
使用心灵感应(预期)扩展算法,并禁止数字、点、非数字作为数字,我可以建议这3个正则表达式。在同一字符串上连续使用它们,并统一(concat,append)结果
我尝试了一些方法将其组合到一个regexp中,但不幸的是它不起作用。那么
sdf9.99f.23
是否包含一个(或两个)双精度表达式呢?我认为sdf9.99e.23
包含两个双重值:9.99
和.23
。解析非结构化文本的整个问题在于它太容易解释。除非你有一个非常具体的定义,否则你总能找到一个可以争论的案例。@Helgus:但是为什么e
如此特殊以至于它“打断”了字符串呢。为什么f
不这样做?还是一片空白?为什么选择忽略任何其他格式错误的非数字,但这种特定情况会导致算法返回错误?在1a
中找到1
,在1b
中找到1
,在1c
中找到1
,在1d
中找到1
,但在1e
中返回错误。这是为什么?那这有五个、三个、两个还是没有两个呢?@Helgus但是e
也可能是一个普通的e
这不是一个精确的定义。不幸的是,你的“正确”(根据评论)与其他人的不同。因此,您需要提供准确的定义。“像这样的字符串9.99e.23是错误的”不是完整准确的定义。抱歉,但如果我(或其他人)不会对每一个单词都吹毛求疵,你会得到不准确/错误的算法,或者根本不会得到。
"[+-]?\\d+((?![\d.])|$)" // ±digits w/o dot after them (actually, this is integer)
"[+-]?\\d+\\.\\d+((?![\deE])|$)" // ±digits, dot, digit w/o [eE] after them
"[+-]?\\d+\\.\\d+[eE][+-]?\\d+" // full variant: ±digits, dot, digits, "e", ±digits