浮点文本的Regexp

浮点文本的Regexp,regex,Regex,我在寻找一个正则表达式来表示十进制浮点值 与整数文本不匹配 123无效 不需要在点前面加数字 .123有效 需要在点后加一个数字 1.无效 1.1有效 允许在除第一个位置以外的任何位置使用下划线 .1\u 2有效 \uu12无效 1_2.0有效 允许使用指数指示器 1e2有效 1.1e2有效 请注意,这不是重复,因为该问题没有提到浮点的指数部分,这给答案增加了大量复杂性,因为regexp的每个元素都简单明了,下面是它们的定义: 整数部分是[0-9][0-9.]* 小数部

我在寻找一个正则表达式来表示十进制浮点值

  • 与整数文本不匹配
    • 123
      无效
  • 不需要在点前面加数字
    • .123
      有效
  • 需要在点后加一个数字
    • 1.
      无效
    • 1.1
      有效
  • 允许在除第一个位置以外的任何位置使用下划线
    • .1\u 2
      有效
    • \uu12
      无效
    • 1_2.0
      有效
  • 允许使用指数指示器
    • 1e2
      有效
    • 1.1e2
      有效

请注意,这不是重复,因为该问题没有提到浮点的指数部分,这给答案增加了大量复杂性

,因为regexp的每个元素都简单明了,下面是它们的定义:

  • 整数部分是
    [0-9][0-9.]*
  • 小数部分是
    \.[0-9][0-9\]*
  • 指数部分是
    [eE][+-]?[0-9][0-9.]*
接下来,将枚举有效分组和无效分组:

|int|dec|exp|->|valid|
|===|===|===|==|=====|
| no| no| no|->| no  |
| no| no|yes|->| no  |
| no|yes| no|->| yes |
| no|yes|yes|->| yes |
|yes| no| no|->| no  |
|yes| no|yes|->| yes |
|yes|yes| no|->| yes |
|yes|yes|yes|->| yes |
几个重复的regexp并不太糟糕,但是12个重复就太多了。这可以通过将表格简化为尽可能最小的形式来解决:

|int|dec|exp|->|valid|
|===|===|===|==|=====|
|yes| ? |yes|->| yes |
| ? |yes| ? |->| yes |
表示无论表达式是否存在,匹配仍然有效

在子规则中替换为:

# Row 1
(?:[0-9][0-9_]*+)
(?:\.[0-9][0-9_]*)?
(?:[eE][+-]?[0-9][0-9_]*)

| # Row 2
(?:[0-9][0-9_]*)?
(?:\.[0-9][0-9_]*)
(?:[eE][+-]?[0-9][0-9_]*)?
如果您喜欢模糊代码,也可以这样编写

(?:[0-9][0-9_]*)(?:\.[0-9][0-9_]*)?(?:[eE][+-]?[0-9][0-9_]*)|(?:[0-9][0-9_]*)?(?:\.[0-9][0-9_]*)(?:[eE][+-]?[0-9][0-9_]*)?

由于regexp的每个元素都简单明了,下面是它们的定义:

  • 整数部分是
    [0-9][0-9.]*
  • 小数部分是
    \.[0-9][0-9\]*
  • 指数部分是
    [eE][+-]?[0-9][0-9.]*
接下来,将枚举有效分组和无效分组:

|int|dec|exp|->|valid|
|===|===|===|==|=====|
| no| no| no|->| no  |
| no| no|yes|->| no  |
| no|yes| no|->| yes |
| no|yes|yes|->| yes |
|yes| no| no|->| no  |
|yes| no|yes|->| yes |
|yes|yes| no|->| yes |
|yes|yes|yes|->| yes |
几个重复的regexp并不太糟糕,但是12个重复就太多了。这可以通过将表格简化为尽可能最小的形式来解决:

|int|dec|exp|->|valid|
|===|===|===|==|=====|
|yes| ? |yes|->| yes |
| ? |yes| ? |->| yes |
表示无论表达式是否存在,匹配仍然有效

在子规则中替换为:

# Row 1
(?:[0-9][0-9_]*+)
(?:\.[0-9][0-9_]*)?
(?:[eE][+-]?[0-9][0-9_]*)

| # Row 2
(?:[0-9][0-9_]*)?
(?:\.[0-9][0-9_]*)
(?:[eE][+-]?[0-9][0-9_]*)?
如果您喜欢模糊代码,也可以这样编写

(?:[0-9][0-9_]*)(?:\.[0-9][0-9_]*)?(?:[eE][+-]?[0-9][0-9_]*)|(?:[0-9][0-9_]*)?(?:\.[0-9][0-9_]*)(?:[eE][+-]?[0-9][0-9_]*)?

12.e3怎么样<代码>1_2_3_4<代码>1\u\u 2?这些文字有语法吗?@thg435我看不出带下划线的示例无效的原因,除了它们是整数文字。编辑此问题是为了解决您的第一点。12.e3如何<代码>1_2_3_4<代码>1\u\u 2?这些文字有语法吗?@thg435我看不出带下划线的示例无效的原因,除了它们是整数文字。编辑此问题是为了解决您的第一点。