3

我目前正在尝试在 js 中编写一个正则表达式,它将从混合字符串中提取十进制数。

示例字符串如下

mixed string123,456,00indeed
mixed string123,456.00indeed
mixed string123,4indeed
mixed string123,40indeed
mixed string 1,0
mixed string 1,00indeed
mixed string 1,00.00indeed

我想要的输出如下

123,456,00
123,456.00
123,4
123,40
1,0
1,00
1,00.00

如果我运行以下正则表达式

(\d+\,)+(.)+(\d+)

当小数点后跟一个数字时,它不会返回任何匹配项。例如。以下情况

mixed string123,4indeed
mixed string 1,0

我不确定如何调整适用于所有此类情况的正则表达式。如果有人可以请帮助我将非常有帮助。完整的js在这里

var str='mixed string123,4indeed';
str.match(/(\d+\,)+(.)+(\d+)/gm);

正则表达式101截图

我也在 regex101 中得到这个,我不知道如何破译

A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you're not interested in the data
4

2 回答 2

2

下面提供的示例代码的正则表达式 ... /\D+([\d,.]+)/g... 内容如下 ...

  • / ... /g... 全局匹配 ...
  • ... \D+...任何不是数字的字符(序列)...
  • ... ([\d,.]+)... 后跟一个数字或逗号或点的字符(序列)...
  • ......必须被捕获( ... )......

将此正则表达式传递给matchAll确实会返回一个迭代器对象,该对象可以转换为一个数组。在(a)成功匹配的情况下,该数组不为空,可以map插入例如所需的最终结果......

const sampleText = `mixed string123,456,00indeed
  mixed string123,456.00indeed
  mixed string123,4indeed
  mixed string123,40indeed
  mixed string 1,0
  mixed string 1,00indeed
  mixed string 1,00.00indeed`;

console.log([

  // see [https://regex101.com/r/QduIQl/1]
  ...sampleText.matchAll(/\D+([\d,.]+)/g)

  ].map(([match, capture]) => capture)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }

更具体的正则表达式 ... \d+(?:[,.]\d+)*... 直接匹配一个精确的模式。因此,示例代码的实现可以简化为类似...

sampleText.match(/\d+(?:[,.]\d+)*/g)

正则表达式本身如下所示...

  • / ... /g... 全局匹配 ...
  • \d+...一个数字(序列)后跟...
  • (?: ... )* ... 一个可选且可能重复的 ( *) 未捕获 ( ?:) 组 ( (...)) 以下模式 ...
  • [,.]\d+... 一个逗号或一个点,后跟一个数字(序列)。

const sampleText = `mixed string123,456,00indeed
  mixed string123,456.00indeed
  mixed string123,4indeed
  mixed string123,40indeed
  mixed string 1,0
  mixed string 34.
  mixed string 21
  mixed string 1,00indeed
  mixed string 1,00.00indeed`;

console.log(
  // see [https://regex101.com/r/QduIQl/3]
  sampleText.match(/\d+(?:[,.]\d+)*/g)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }

于 2021-03-26T21:47:56.460 回答
1

您可以使用

/\d+(?:,\d+)*(?:\.\d+)?/g

请参阅正则表达式演示

详情

  • \d+- 一位或多位数字
  • (?:,\d+)*- 零个或多个逗号和一个或多个数字
  • (?:\.\d+)?- 一个点和一个或多个数字的可选出现。

请参阅 JavaScript 演示:

var texts = ['mixed string123,456,00indeed','mixed string123,456.00indeed','mixed string123,4indeed','mixed string123,40indeed','mixed string 1,0','mixed string 1,00indeed','mixed string 1,00.00indeed'];
var rx = /\d+(?:,\d+)*(?:\.\d+)?/g
for (var i=0; i<texts.length;i++) {
  console.log(texts[i], '->', (texts[i].match(rx) || ["No match!"])[0]);
}

于 2021-03-26T22:29:05.980 回答