任务:
MATCH:
3.45
5,4
.45
3e4
,54
4
4.
4,
DON'T MATCH:
4,5e
2e
.3.
2e,4
,4.
d34
2.45t
2,45.
目前,我提出了以下建议:
(?<=\s|^)[-+]?(?:(?:[.,]?\d+[.,]?\d*[eE]\d+(?!\w|[.,]))|[.,]?\d+[.,]?\d*(?!\w|[.,]))\b
这几乎适用于所有内容,除了最后两个数字(4和4)并卡住了
答案 0 :(得分:1)
您可以使用
(?<!\S)[-+]?[0-9]*(?:[.,]?[0-9]+(?:[eE][-+]?[0-9]+)?|(?<=\d)[,.])(?!\S)
请参见regex demo
详细信息
(?<!\S)
-字符串的开头或空格必须立即显示在左侧[-+]?
-可选的+
或-
[0-9]*
-0位数以上(?:[.,]?[0-9]+(?:[eE][-+]?[0-9]+)?|[,.])
-
[.,]?[0-9]+(?:[eE][-+]?[0-9]+)?
-可选的.
或,
,然后是1+位数字,然后是可选的序列e
或E
,然后是可选的{ {1}}或.
和1个以上的数字,
-或|
-仅在数字前加点或逗号(以避免匹配独立的(?<=\d)[,.]
或.
),
-字符串的结尾或空格必须立即显示在右侧。正则表达式图:
答案 1 :(得分:1)
您可以使用alternation来匹配1+位数字,后跟点或逗号和0+位数字,或者匹配Ee
部分,然后是1+位数字。
或者以点或逗号后跟1+数字开头的匹配项。
如果这是唯一要匹配的行,则可以使用锚点^
和$
或使用环视方法断言左右没有非空白字符。
(?<!\S)(?:\d+(?:[.,]\d*|[eE]\d+)?|[.,]\d+)(?!\S)
样式部分
(?<!\S)
断言直接在左边的是非空格字符(?:
非捕获组
\d+
匹配1个以上的数字(?:
非捕获组
[.,]\d*
匹配.
或,
和0个以上的数字|
或[eE]\d+
匹配e
或E
和1个以上的数字)?
关闭组并将其设置为可选|
或[.,]\d+
匹配.
或,
和1个以上的数字)
关闭群组(?!\S)
断言在右边直接是非空格字符